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

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中找到几乎相同的示例

 Map<Student, Double> studentToGPA
     students.stream().collect(toMap(Functions.identity(),
                                     student -> computeGPA(student)));
Run Code Online (Sandbox Code Playgroud)


Hol*_*ger 7

正如在其他答案中已经说过的那样,您需要指定一个函数,将每个元素映射到固定值,如element -> samePrice.

另外,如果你想专门填写一个ConcurrentHashMap,有一个简洁的功能,根本不需要流操作:

ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>();
map.keySet(samePrice).addAll(set);
Run Code Online (Sandbox Code Playgroud)

不幸的是,对于任意Maps 都没有这样的操作.