我有一个来自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 的收集器指南。