我有一部分来自 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
不太明白什么是(String, Double) -> String, LinkedHashMap::new。 它是否创建了一个以 String 为键值的 LinkedHashMap?但是为什么需要 Double in (String, Double)?
另一个例子是 map 的一部分
.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 值的函数因此是Map.Entry::getValue
,一个合并函数,用于在有两个键相等的情况下解决冲突,因此 (String, Double) -> String
(基本上是说“如果两个给定的键相等,则保留第一个的值并丢弃第二个”)最后是 LinkedHashMap::new
指出减少的结果应存储在 LinkedHashMap
中实例。
您提供的第二个示例片段:
.collect(Collectors.groupingBy(String::toLowerCase,
TreeMap::new,
Collectors.counting());
声明流的元素将按小写的字符串分组,归约的结果将累积到一个TreeMap
中。并且映射值将是流中每个字符串出现的计数。因此,生成的 map 将是 TreeMap<String, Long>
.
您提供的第三个示例片段:
.collect(Collectors.groupingBy(entry -> entry.getKey().charAt(0),
TreeMap::new,
Collectors.toList());
声明流中的元素将按输入键的第一个字符分组,归约的结果将累积到一个TreeMap
中。 values 是流元素的列表。因此,生成的 map 是 TreeMap<Character, List<T>>
其中 T
是流中元素的类型。
此外,您可以查看 Collectors API并对其进行试验和/或查看 Guide to Java 8’s Collectors .
关于java - 需要帮助理解集合在 lambda 语句中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823816/