使用流解释的Java8方法
我对Java8有点陌生,我正在尝试理解下面的代码是做什么的
@Override
public Optional<String> getMostFrequentLastName(final List<User> users) {
return
users.stream()
.collect(Collectors.groupingBy(User::getLastName, Collectors.counting()))
.entrySet()
.stream()
.filter(entry -> entry.getValue() >= 2)
.reduce((e1, e2) ->
e1.getValue() < e2.getValue() ? e2 :
e1.getValue() > e2.getValue() ? e1 :
new AbstractMap.SimpleEntry<>(null, e1.getValue()))
.map(Map.Entry::getKey);
}
有人能详细解释一下这是怎么回事吗
# 1 楼答案
这里的
reduce
操作非常混乱:我想说的是,这在一定程度上混淆了格式:
(但只是部分)
记住
e*.getValue()
是一个名字出现的次数。这是说:null
,并将其与出现的次数一起返回李>返回名称
null
有点令人困惑,因为不知道您的要求——看起来这实际上是为了找到出现次数最多的名称,但前提是没有其他出现次数最多的名称reduce
将返回一个Optional<Map.Entry<String, Long>>
(如果列表中至少有一个人,则会返回)。随后的.map(Map.Entry::getKey)
只提取名称并丢弃计数请注意,在许多名称出现最大计数的情况下,
getKey
返回null
,这意味着方法总体返回Optional.empty()