我想初始化一个Map<String, BigDecimal>
,并希望始终从流外部添加相同的BigDecimal
值。
BigDecimal samePrice;
Set<String> set;
set.stream().collect(Collectors.toMap(Function.identity(), samePrice));
然而,Java抱怨如下:
收集器类型中的toMap(Function,Function)方法不适用于参数 (函数,BigDecimal)
为什么我不能从外面使用BigDecimal?如果我写:
set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));
它会起作用,但那当然不是我想要的。
答案 0 :(得分:16)
toMap(keyMapper, valueMapper)
的第二个参数(如第一个参数)是一个获取流元素并返回地图值的函数。
在这种情况下,您要忽略它,以便:
set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice));
请注意,您的第二次尝试不会出于同样的原因。
答案 1 :(得分:10)
Collectors#toMap
需要两个Functions
set.stream().collect(Collectors.toMap(Function.identity(), x -> samePrice));
您可以在JavaDoc
中找到几乎相同的示例Map<Student, Double> studentToGPA students.stream().collect(toMap(Functions.identity(), student -> computeGPA(student)));
答案 2 :(得分:7)
正如在其他答案中已经说过的那样,你需要指定一个函数,它将每个元素映射到固定值,如element -> samePrice
。
另外,如果你想专门填写ConcurrentHashMap
,有一个简洁的功能根本不需要流操作:
ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>();
map.keySet(samePrice).addAll(set);
不幸的是,对于任意Map
s没有这样的操作。