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

时间:2018-06-12 18:43:39

标签: java lambda collections

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

.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作为keyvalue创建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());

它们实际上意味着什么?

1 个答案:

答案 0 :(得分:3)

您提到的toMap版本会使用keyMapper函数,该函数用于提取地图键,因此使用Map.Entry::getKeyvalueMapper函数提取映射值因此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并试用它和/或查看Guide to Java 8’s Collectors