Java 8 方法使用流解释

Java 8 method using streams explanation

我是 Java 8 的新手,我想了解以下代码的作用

@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);
}

谁能详细解释一下这是怎么回事?

The most confusing i think for me is the reduce and map parts

这里的reduce操作比较混乱:

        .reduce((e1, e2) -> e1.getValue() < e2.getValue() ? e2 :
                e1.getValue() > e2.getValue() ? e1 :
                        new AbstractMap.SimpleEntry<>(null, e1.getValue()))

我想说的部分原因是格式混乱:

    .reduce(
        (e1, e2) ->
            e1.getValue() < e2.getValue()
                ? e2
                : e1.getValue() > e2.getValue()
                    ? e1
                    : new AbstractMap.SimpleEntry<>(null, e1.getValue()))

(但只是部分)。

请记住,e*.getValue() 是名称出现的次数。所以,这就是说:

  • 如果 name1 出现的次数少于 name2,则 name2 是我们迄今为止找到的最好的名字
  • 如果 name2 出现的次数多于 name1,则 name1 是我们目前找到的最好的名字
  • 否则,它们出现的次数相同 - 在这种情况下,组成一个新名称,null,return 与出现次数相同。

返回名称null有点混乱,不知道你的要求 - 看起来这实际上是为了找到出现次数最多的名称,但前提是没有其他出现该次数的名称。

reduce 将 return 和 Optional<Map.Entry<String, Long>>(如果列表中至少有一个人,则存在)。随后的 .map(Map.Entry::getKey) 只是提取名称并丢弃计数。

请注意,在出现多个名称的最大计数的情况下,getKey returns null,这意味着整个方法 returns Optional.empty().