如何使用流外部的值使用Java流API创建映射?

时间:2016-04-01 12:12:04

标签: java java-8 java-stream collectors

我想初始化一个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()));

它会起作用,但那当然不是我想要的。

3 个答案:

答案 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没有这样的操作。