You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中筛选年龄≤平均年龄的最高篮球球员及Stream API报错解决

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 06:58:01