【问题标题】:Need help understanding the use of collections in lambda statements需要帮助了解 lambda 语句中集合的使用
【发布时间】:2018-06-12 18:43:39
【问题描述】:

我有一部分来自 Map 的 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());

它们到底是什么意思?

【问题讨论】:

  • 查看文档docs.oracle.com/javase/8/docs/api/java/util/stream/… 有该 groupingBy 方法的三个签名,每个签名都有一个描述准确描述做什么的描述
  • 除非String 是当前范围内的变量,否则(String, Double) -> String 无效(即使使用类名声明变量已经够糟糕了)。
  • (String, Double) -> String(a, b) -> a 相同。 StringDouble 是变量名。似乎写它的人不知道他们在做什么,或者他们试图混淆阅读它的人。

标签: java lambda collections


【解决方案1】:

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

您提供的第二个示例 sn-p:

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

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

您提供的第三个示例 sn-p:

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

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


此外,您可以查看Collectors API 并进行试验和/或查看Guide to Java 8’s Collectors

【讨论】:

  • 其实多读几遍就明白了!谢谢!如果您确实收到通知,我实际上是在询问 (String, Double) -> String 但后来我意识到这是合并。当你说这个'(基本上说“如果两个给定的键相等,则保留第一个的值并丢弃第二个”)'时,我认为它是在比较合并的键。
猜你喜欢
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2016-05-03
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
相关资源
最近更新 更多