mem*_*und 20 java java-8 java-stream collectors
我想初始化Map<String, BigDecimal>并希望始终BigDecimal从流外部添加相同的值.
BigDecimal samePrice;
Set<String> set;
set.stream().collect(Collectors.toMap(Function.identity(), samePrice));
Run Code Online (Sandbox Code Playgroud)
但是Java抱怨如下:
收集器类型中的Map(Function,Function)方法不适用于参数(Function,BigDecimal)
为什么我不能从外面使用BigDecimal?如果我写:
set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));
Run Code Online (Sandbox Code Playgroud)
它会起作用,但那当然不是我想要的.
Tun*_*aki 16
第二个参数(如第一个参数)toMap(keyMapper, valueMapper)是一个函数,它接受stream元素并返回map的值.
在这种情况下,您要忽略它,以便您可以:
set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice));
Run Code Online (Sandbox Code Playgroud)
请注意,您的第二次尝试不会出于同样的原因.
Yas*_*jaj 10
Collectors#toMap 期待两个 Functions
set.stream().collect(Collectors.toMap(Function.identity(), x -> samePrice));
Run Code Online (Sandbox Code Playgroud)
您可以在JavaDoc中找到几乎相同的示例
Run Code Online (Sandbox Code Playgroud)Map<Student, Double> studentToGPA students.stream().collect(toMap(Functions.identity(), student -> computeGPA(student)));
正如在其他答案中已经说过的那样,您需要指定一个函数,将每个元素映射到固定值,如element -> samePrice.
另外,如果你想专门填写一个ConcurrentHashMap,有一个简洁的功能,根本不需要流操作:
ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>();
map.keySet(samePrice).addAll(set);
Run Code Online (Sandbox Code Playgroud)
不幸的是,对于任意Maps 都没有这样的操作.
| 归档时间: |
|
| 查看次数: |
3488 次 |
| 最近记录: |