java - 需要帮助理解集合在 lambda 语句中的使用

标签 java lambda collections

我有一部分来自 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/

相关文章:

java - java I/O字节流类的查询

lambda - Prolog - 将一个列表与一个元素相乘,结果带有一个奇怪的尾部?

c++ - 为什么这个简单的 lambda 在 std::thread 中始终比在 gcc 4.9.2 的 main 函数中运行得更快?

Java/Hibernate - 将额外的字段添加到数组表中?

dictionary - Kotlin:集合定义的差异

java - BlazeDS vs GraniteDS - 2 年后

java - java中的自定义游标

java - 模式 "Form 1987A"的正则表达式

python - 只是用 lambda 尝试/排除 - Python?

java - 在 Java 中比较 "Queue"对象