需要帮助了解 lambda 语句中集合的使用



我有一个来自Map <'String, Double>的lambda语句的一部分,我不太明白。

.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue, (String, Double) -> String,
LinkedHashMap::new);

我认为这意味着什么:

Map.Entry::getKey is stating variable String,
Map.Entry::getValue is stating variable Double

不太明白什么(字符串,双精度(->字符串,LinkedHashMap::new。 它是否创建了一个以字符串作为键值的 LinkedHashMap?但是为什么需要双入(字符串,双倍(呢?

另一个示例是地图的一部分

.collect(Collectors.groupingBy(String::toLowerCase, TreeMap::new, Collectors.counting());
then followed by...
.collect(Collectors.groupingBy(entry -> 
entry.getKey().charAt(0), TreeMap::new, Collectors.toList());

它们实际上意味着什么?

您提到的toMap版本使用了一个keyMapper函数,该函数用于提取映射键,因此Map.Entry::getKey,一个用于提取映射值的valueMapper函数,因此Map.Entry::getValue,一个用于解决冲突的合并函数,以防有两个键相等,因此(String, Double) -> String(它基本上说"如果两个给定键相等,则保留第一个键的值并丢弃第二个(,最后LinkedHashMap::new声明减少的结果应存储在LinkedHashMap实例中。

您提供的第二个示例代码段:

.collect(Collectors.groupingBy(String::toLowerCase,
TreeMap::new, 
Collectors.counting());

声明流的元素将按小写字符串分组,缩减的结果将累积到TreeMap中,映射值将是流中出现的每个字符串的计数。因此,生成的地图将TreeMap<String, Long>.

您提供的第三个示例代码段:

.collect(Collectors.groupingBy(entry -> entry.getKey().charAt(0), 
TreeMap::new, 
Collectors.toList());

声明流的元素将按输入键的第一个字符分组,减少的结果将累积到TreeMap中,值是流元素的列表。因此,生成的映射是一个TreeMap<Character, List<T>>,其中T是流中元素的类型。


此外,您可以查看 Collectors API 并对其进行试验和/或查看 Java 8 的收集器指南。

最新更新