如何使用Java streams获取具有最高值的所有元素?

如何使用Java streams获取具有最高值的所有元素?,java,java-8,java-stream,Java,Java 8,Java Stream,我有以下几点建议: class MyPojo { String name; int priority; } 我有一个列表。现在,我想检索所有具有最高优先级的元素。这些元素的顺序并不重要 这在Java流中是可能的吗?我认为我应该首先按优先级分组,然后获取属于最高优先级的所有元素,但我不确定如何以有效的方式执行此操作。您应该将其转换为IntStream,并从中获取max()。 然后用这个值得到每个POJO import java.util.List; 导入java.util.str

我有以下几点建议:

class MyPojo {
    String name;
    int priority;
}
我有一个
列表
。现在,我想检索所有具有最高优先级的元素。这些元素的顺序并不重要


这在Java流中是可能的吗?我认为我应该首先按优先级分组,然后获取属于最高优先级的所有元素,但我不确定如何以有效的方式执行此操作。

您应该将其转换为
IntStream
,并从中获取
max()
。 然后用这个值得到每个POJO

import java.util.List;
导入java.util.stream.collector;
MyPojo类{
字符串名;
int优先级;
public int getPriority(){
返回优先级;
}
}
公共班机{
公共静态void main(字符串[]args){
List=null;
int max=list.stream().mapToInt(MyPojo::getPriority).max().orElse(Integer.MIN_值);
List maxPojos=List.stream().filter(pojo->pojo.getPriority()==max.collect(Collectors.toList());
}
}

您可以使用
TreeMap
收集器执行此操作。groupingBy()

TreeMap map=pojos.stream()
.collect(收集器.groupingBy(
MyPojo::getPriority,
树映射::新的,
收集者
));
List maxPrios=map.lastEntry().getValue();

lastEntry()
将返回具有最高优先级的POJO,这是由于
Integer
s的自然顺序,其中最小值将排在第一位,最大值将排在最后。

谢谢。这将在列表中循环两次。有没有一种方法可以通过首先分组然后得到第一个(最高的)组来解决这个问题?我相信这应该更有效。看看@Lino的答案。你可以像@Stuart Marks在这里建议的那样,编写一个名为
maxList
的定制收集器:通过集成,临时收集器才是我真正想要的,因为这是我在考虑过程时想到的。这是一个更优雅的解决方案,而且它也促进了重用。