如何用Java Stream按技能列表长度排序并找出技能最多的用户?
解决方案
报错原因
你之前的代码Comparator.comparing(User::skills)编译报错,是因为List<String>类没有实现Comparable接口,Java无法直接比较两个List实例的大小,必须基于技能列表的长度来构建比较逻辑。
实现方式
方式1:找到单个技能最多的用户(若有多个取第一个)
直接使用Stream的max()方法,结合基于技能数量的比较器,无需排序整个流,效率更高:
users.stream() .max(Comparator.comparingInt(user -> user.skills().size())) .ifPresent(user -> { System.out.println("姓名: " + user.name()); System.out.println("技能列表: " + user.skills()); });
运行结果会输出技能最多的用户信息:
姓名: Agnieszka
技能列表: [Java, Scala, Kotlin, Haskell, Clojure]
方式2:找出所有技能数量最多的用户(处理并列情况)
如果存在多个用户技能数量相同且都是最大值,可先算出最大技能数,再筛选符合条件的用户:
// 第一步:获取最大技能数量 int maxSkillCount = users.stream() .mapToInt(user -> user.skills().size()) .max() .orElse(0); // 第二步:筛选出所有技能数等于最大值的用户 users.stream() .filter(user -> user.skills().size() == maxSkillCount) .forEach(user -> { System.out.println("姓名: " + user.name()); System.out.println("技能列表: " + user.skills()); System.out.println("---"); });
当前数据中只有Agnieszka符合条件,若有其他用户技能数也是5,会一并输出。
内容的提问来源于stack exchange,提问作者Arkadiusz
相关产品推荐
相关产品推荐

