Collectors.toMap 有三个重载的变体。
1. 键值映射器:
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
Run Code Online (Sandbox Code Playgroud)
2.扩展1添加合并功能:
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
Run Code Online (Sandbox Code Playgroud)
3.用地图供应商扩展2:
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么没有采用关键供应商、价值供应商和地图供应商的方法。
当我想使用不同的映射(HashMap 除外)并且我确定我的键映射函数不会生成重复键时,这将很有用。
为了实现这一点,我要么必须为mergeFunction传递(一个简单的)lambda
persons.stream()
.collect(Collectors.toMap(Person::getId, Function.identity(),
(a, b) -> a,
LinkedHashMap::new));
Run Code Online (Sandbox Code Playgroud)
或者,使用 Collectors.collectingAndThen
persons.stream()
.collect(Collectors.collectingAndThen(Collectors.toMap(Person::getId, Function.identity()),
LinkedHashMap::new));
Run Code Online (Sandbox Code Playgroud)
编辑:
正如@Holger 在评论中指出的那样,复制到 aLinkedHashMap将无济于事,因为在通过 toMap 方法填充地图时顺序已经更改
[..]collectingAndThen 没有达到目的,因为将无序映射复制到 LinkedHashMap 之后并不能恢复顺序
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |