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()
.
我是 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()
.