假设我有一个如下对象流.

class MyObject {
    private Some some; // Comparable
    private Other value
}

有没有一个成语在一条链中做以下事情?

  • 给定Stream<MyObject>
  • 查找最大值some.
  • map value,其some为最大值.

犹如,

final List<MyObject> list = getList();
final Some max = list.stream().max(Comparator.naturalOrder())
final List<Other> list = list.stream()
        .filter(e -> Objects.equals(e.some, max)
        .map(e -> e.getValue()).collect(toList());

推荐答案

如果必须一次性完成,可以编写一个自定义收集器,将流减少到max元素列表中.这是一个基于Stuart Marks this answer的实现.

List<MyObject> maxList = list.stream()
                             .collect(maxList(Comparator.comparing(MyObject::getSome)));

static <T> Collector<T,?,List<T>> maxList(Comparator<? super T> comp) {
    return Collector.of(
        ArrayList::new,
        (list, t) -> {
            int c;
            if (list.isEmpty() || (c = comp.compare(t, list.get(0))) == 0) {
                list.add(t);
            } else if (c > 0) {
                list.clear();
                list.add(t);
            }
        },
        (list1, list2) -> {
            if (list1.isEmpty()) {
                return list2;
            } 
            if (list2.isEmpty()) {
                return list1;
            }
            int r = comp.compare(list1.get(0), list2.get(0));
            if (r < 0) {
                return list2;
            } else if (r > 0) {
                return list1;
            } else {
                list1.addAll(list2);
                return list1;
            }
        });
}

收集器将维护一个用于结果的ArrayList,并将每个元素累加到其中,判断该元素与当前列表的第一个元素的比较情况.第c = comp.compare(t, list.get(0))) == 0部分将判断元素是否具有相同的最大值,如果是,则将其添加到列表中.

Java相关问答推荐

如何在Java中使用Rest模板通过查询参数发送GET请求

判断大写字符串的Java方法总是返回假

java.lang. StackOverFlow错误:显示表及其依赖项时为空

Java -使用空比较或instanceof?

为什么JFrame paint()多次绘制同一点(或根本不绘制)?

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

如何在Docker容器中使用wireock—Webhooks阻止请求?

我的scala文件失败了Scala.g4 ANTLR语法

工件部署期间出错[Tomcat 8.5.45]

Java中如何根据Font.canDisplay方法对字符串进行分段

我找不到&Quot;配置&的位置

Spring和可编辑";where";@Query

通过Spring Security公开Spring Boot执行器端点

Arrays.hashcode(int[])为不同的元素提供相同的散列

如何在Java springboot中从一个端点发送多个时间响应?

Java组件项目中的JavaFX对话框国际化

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

为什么创建Java动态代理需要接口参数

使用同步方法中的新线程调用同步方法

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API