java8中的toMap使用


1.toMap的幾個方法

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
}

  

    public static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction) {
        return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
    }

  

public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction,Supplier<M> mapSupplier) {
        BiConsumer<M, T> accumulator
                = (map, element) -> map.merge(keyMapper.apply(element),
                                              valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
    }

  

2.參數含義分別是:

  1. keyMapper:Key 的映射函數

  2. valueMapper:Value 的映射函數

  3. mergeFunction:當 Key 沖突時,調用的合並方法

  4. mapSupplier:Map 構造器,在需要返回特定的 Map 時使用

 

3.

    @Test
    public void tpMap() throws JsonProcessingException {
        List<User> userList = Lists.newArrayList(
                new User().setId("A").setName("張三"),
                new User().setId("B").setName("李四"),
                new User().setId("C").setName("王五")
        );
        // 格式:A-> 張三
        Map<String, String> collect = userList.stream().collect(Collectors.toMap(User::getId, User::getName));
        log.info("collect:{}", mapper.writerWithDefaultPrettyPrinter().writeValueAsString(collect));

        // 格式:得到 Map 的 value 為對象本身時
        Map<String, User> collect1 = userList.stream().collect(Collectors.toMap(User::getId, t -> t));
        log.info("collect1:{}", mapper.writerWithDefaultPrettyPrinter().writeValueAsString(collect1));

        // 格式:得到 Map 的 value 為對象本身時
        Map<String, User> collect2 = userList.stream().collect(Collectors.toMap(User::getId, Function.identity()));
        log.info("collect2:{}", mapper.writerWithDefaultPrettyPrinter().writeValueAsString(collect2));
    }

  效果:

14:29:51.734 [main] INFO com.jun.prove.common.test.MapTest - collect:{
  "A" : "張三",
  "B" : "李四",
  "C" : "王五"
}
14:29:51.782 [main] INFO com.jun.prove.common.test.MapTest - collect1:{
  "A" : {
    "id" : "A",
    "name" : "張三"
  },
  "B" : {
    "id" : "B",
    "name" : "李四"
  },
  "C" : {
    "id" : "C",
    "name" : "王五"
  }
}
14:29:51.782 [main] INFO com.jun.prove.common.test.MapTest - collect2:{
  "A" : {
    "id" : "A",
    "name" : "張三"
  },
  "B" : {
    "id" : "B",
    "name" : "李四"
  },
  "C" : {
    "id" : "C",
    "name" : "王五"
  }
}

  

4.調用第二個重載方法,傳入合並函數

  如果 List 中 userId 有相同的,使用上面的寫法會拋異常

    @Test
    public void tpMapExtend() throws JsonProcessingException {
        List<User> userList = Lists.newArrayList(
                new User().setId("A").setName("張三"),
                new User().setId("A").setName("李四"), // Key 相同
                new User().setId("C").setName("王五")
        );
        //
        Map<String, String> collect = userList.stream().collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1 + n2));
        log.info("collect:{}", mapper.writeValueAsString(collect));

        //
        TreeMap<String, String> collect1 = userList.stream().collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n1, TreeMap::new));
        log.info("collect1:{}", mapper.writeValueAsString(collect1));

    }

  效果

14:31:46.127 [main] INFO com.jun.prove.common.test.MapTest - collect:{"A":"張三李四","C":"王五"}
14:31:46.135 [main] INFO com.jun.prove.common.test.MapTest - collect1:{"A":"張三","C":"王五"}

  

5.第三個方法

  第四個參數(mapSupplier)用於自定義返回 Map 類型,比如我們希望返回的 Map 是根據 Key 排序的

  在上面的程序中,已經寫過了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM