Java中筛选年龄≤平均年龄的最高篮球球员及Stream API报错解决
哥们,我来帮你搞定这个问题!先拆解下你遇到的问题,再一步步给你实现完整的需求~
一、先搞懂你的报错根源
你写的players.stream().max((Comparator<? super Object>) playerheight)之所以报错,是因为**max()方法需要的是一个Comparator(比较器)来定义元素的比较规则,而你直接把Height类型的对象传进去了**,Java自然会报错说没法把Height转成Comparator——这俩完全是不同类型的东西嘛!
二、完整解决方案:分两步实现需求
你的核心需求是:先算出所有球员的平均年龄,再从年龄≤平均年龄的球员里找身高最高的。咱们一步步来写:
1. 先计算所有球员的平均年龄
假设你的球员类是Player(应该包含name、age、height属性,且有对应的getter方法),用Stream API可以轻松算出平均年龄:
// 计算平均年龄,处理空列表的情况(默认0.0) double averageAge = players.stream() .mapToInt(Player::getAge) .average() .orElse(0.0);
2. 筛选+找最高球员
接下来要过滤出年龄符合要求的球员,再找其中身高最高的。这里有两种常用方案:
方案1:让Height类实现Comparable接口
如果你的Height类本身应该支持大小比较,那让它实现Comparable<Height>是最方便的:
public class Height implements Comparable<Height> { private int feet; private int inches; // 构造方法、getFeet()、getInches()等方法 // 先写个工具方法,把身高转成总英寸,方便比较 public int getTotalInches() { return feet * 12 + inches; } @Override public int compareTo(Height other) { // 按总英寸数比较,大的身高更高 return Integer.compare(this.getTotalInches(), other.getTotalInches()); } }
这时候找最高球员的代码就很简洁:
// 过滤年龄≤平均年龄的球员,再找身高最高的 Optional<Player> tallestEligiblePlayer = players.stream() .filter(player -> player.getAge() <= averageAge) .max(Comparator.comparing(Player::getHeight));
方案2:不修改Height类,直接在Stream里写比较逻辑
如果你不想修改Height类,也可以在max()方法里直接指定比较规则,不用让Height实现Comparable:
Optional<Player> tallestEligiblePlayer = players.stream() .filter(player -> player.getAge() <= averageAge) .max((p1, p2) -> { // 把两个球员的身高都转成总英寸,再比较 int p1Total = p1.getHeight().getFeet() * 12 + p1.getHeight().getInches(); int p2Total = p2.getHeight().getFeet() * 12 + p2.getHeight().getInches(); return Integer.compare(p1Total, p2Total); });
或者用更简洁的Comparator.comparingInt写法:
Optional<Player> tallestEligiblePlayer = players.stream() .filter(player -> player.getAge() <= averageAge) .max(Comparator.comparingInt(p -> p.getHeight().getFeet() * 12 + p.getHeight().getInches()));
3. 处理结果(避免空指针)
最后别忘了处理Optional的情况——如果没有符合年龄要求的球员,tallestEligiblePlayer会是空的:
tallestEligiblePlayer.ifPresentOrElse( player -> System.out.printf("符合要求的最高球员是:%s,身高:%d英尺%d英寸%n", player.getName(), player.getHeight().getFeet(), player.getHeight().getInches()), () -> System.out.println("没有找到年龄≤平均年龄的球员") );
三、再给你提个小建议
以后用Stream的max()/min()方法时,记住:括号里必须传一个Comparator,用来告诉Java怎么判断两个元素谁大谁小,不能直接传要比较的属性对象哦!
内容来源于stack exchange

