如何使用流外的值创建具有 Java 流 API 的映射?
How to create a map with Java stream API using a value outside the stream?
我想初始化一个 Map<String, BigDecimal>
并希望始终从流外部放置相同的 BigDecimal
值。
BigDecimal samePrice;
Set<String> set;
set.stream().collect(Collectors.toMap(Function.identity(), samePrice));
然而 Java 抱怨如下:
The method toMap(Function, Function) in the type Collectors is not applicable for the arguments
(Function, BigDecimal)
为什么我不能从外部使用 BigDecimal?如果我写:
set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));
它会起作用,但这当然不是我想要的。
toMap(keyMapper, valueMapper)
的第二个参数(与第一个参数一样)是一个接受流元素和 returns 映射值的函数。
在这种情况下,您想忽略它,这样您就可以:
set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice));
请注意,出于同样的原因,您的第二次尝试不会成功。
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)));
如其他答案中所述,您需要指定一个函数,将每个元素映射到固定值,如 element -> samePrice
。
另外,如果你想专门填充一个ConcurrentHashMap
,有一个很巧妙的特性,根本不需要流操作:
ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>();
map.keySet(samePrice).addAll(set);
不幸的是,任意 Map
s 都没有这样的操作。
我想初始化一个 Map<String, BigDecimal>
并希望始终从流外部放置相同的 BigDecimal
值。
BigDecimal samePrice;
Set<String> set;
set.stream().collect(Collectors.toMap(Function.identity(), samePrice));
然而 Java 抱怨如下:
The method toMap(Function, Function) in the type Collectors is not applicable for the arguments (Function, BigDecimal)
为什么我不能从外部使用 BigDecimal?如果我写:
set.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal()));
它会起作用,但这当然不是我想要的。
toMap(keyMapper, valueMapper)
的第二个参数(与第一个参数一样)是一个接受流元素和 returns 映射值的函数。
在这种情况下,您想忽略它,这样您就可以:
set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice));
请注意,出于同样的原因,您的第二次尝试不会成功。
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)));
如其他答案中所述,您需要指定一个函数,将每个元素映射到固定值,如 element -> samePrice
。
另外,如果你想专门填充一个ConcurrentHashMap
,有一个很巧妙的特性,根本不需要流操作:
ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>();
map.keySet(samePrice).addAll(set);
不幸的是,任意 Map
s 都没有这样的操作。