如何使用Java Streams比较Score对象的points并返回最值对象?
嗨,我来帮你搞定这个问题!用Java Streams找出ArrayList<Score>里points最高或最低的对象其实没那么复杂,我给你拆解清楚,再附上完整的代码示例,你一看就懂。
首先,先确认你的Score类得有获取points的方法(比如getPoints()),假设你的类结构是这样的:
class Score { private int points; public Score(int points) { this.points = points; } // 必须要有这个 getter 方法,Stream要靠它提取points值 public int getPoints() { return points; } // 可选:重写toString方便打印结果 @Override public String toString() { return "Score{points=" + points + "}"; } }
获取最高points的对象
用Stream的max()方法,配合Comparator.comparingInt()来指定按points字段比较:
// 假设你已经有了ArrayList<Score> scores Optional<Score> highestScore = scores.stream() .max(Comparator.comparingInt(Score::getPoints));
获取最低points的对象
同理,用min()方法就行:
Optional<Score> lowestScore = scores.stream() .min(Comparator.comparingInt(Score::getPoints));
关键细节(你之前可能踩坑的地方)
- 返回的是
Optional<Score>而不是直接的Score:这是为了处理列表为空的情况(空列表没有最高/最低分),避免返回null导致空指针。你可以这样安全处理结果:- 如果只想在对象存在时做操作:
highestScore.ifPresent(score -> System.out.println("最高分: " + score)); - 如果确定列表不可能为空,或者想在空的时候抛异常:
Score highest = highestScore.orElseThrow(() -> new IllegalStateException("分数列表为空!")); - 或者给个默认值:
Score defaultScore = new Score(0); Score highest = highestScore.orElse(defaultScore);
- 如果只想在对象存在时做操作:
完整运行示例
把这些拼起来,完整代码如下:
import java.util.ArrayList; import java.util.Comparator; import java.util.Optional; public class ScoreStreamExample { public static void main(String[] args) { ArrayList<Score> scores = new ArrayList<>(); scores.add(new Score(85)); scores.add(new Score(92)); scores.add(new Score(78)); scores.add(new Score(95)); scores.add(new Score(88)); // 找最高分对象 Optional<Score> highestScore = scores.stream() .max(Comparator.comparingInt(Score::getPoints)); highestScore.ifPresent(score -> System.out.println("最高分对象: " + score)); // 找最低分对象 Optional<Score> lowestScore = scores.stream() .min(Comparator.comparingInt(Score::getPoints)); lowestScore.ifPresent(score -> System.out.println("最低分对象: " + score)); } }
运行后会输出:
最高分对象: Score{points=95} 最低分对象: Score{points=78}
如果你的points字段是Integer类型(不是基本类型int),把comparingInt换成comparing也可以,不过comparingInt对基本类型更高效哦。
内容的提问来源于stack exchange,提问作者Carrein
相关产品推荐
相关产品推荐

