【问题标题】:Get a list of object with max values [duplicate]获取具有最大值的对象列表[重复]
【发布时间】:2019-11-26 09:59:49
【问题描述】:

我必须得到包含最大值的对象列表。 Java 8 中的比较器 max 只返回一个对象。

为此,我必须对列表进行两次流式传输:

 OptionalInt max = students.stream()
            .mapToInt(student -> student.getAssignedProjects().size())
            .max();

    return this.students.stream()
            .filter(student -> student.getAssignedProjects().size() == max.getAsInt())
            .collect(Collectors.toSet());

此解决方案有效。我认为有更好的方法来解决这个问题,但我想不通。

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    如果您想要一个管道,您可以按该属性对Students 进行分组,如果您为输出生成TreeMap,它将被排序,因此您可以访问Set对应最大值:

    return
    this.students()
        .stream()
        .collect(Collectors.groupingBy(student -> student.getAssignedProjects().size(),
                 TreeMap::new,
                 Collectors.toSet()))
        .lastEntry()
        .getValue();
    

    当然,如果具有最大值的Students 的数量相对于输入列表的大小来说很小,那么对分组的Students 进行排序(这就是创建TreeMap会做)。您的原始代码会更有效率。

    【讨论】:

    • 有机会在这里使用Collectors.maxBy 吗?到目前为止,我试图找到一个不同的单一管道,但没有成功。
    • @deHaar 我相信maxBy 会返回单个元素(具有最大值),因此它不符合 OP 的要求。
    • 我知道,这就是我没有成功使用它的原因......它不能与Collectors.toList()或类似的一起使用。我认为可能有办法......
    猜你喜欢
    • 2023-02-17
    • 2015-08-11
    • 1970-01-01
    • 2017-09-20
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多