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.參數含義分別是:
-
keyMapper:Key 的映射函數
-
valueMapper:Value 的映射函數
-
mergeFunction:當 Key 沖突時,調用的合並方法
-
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 排序的
在上面的程序中,已經寫過了