java - 如何通过其中的某个最大值过滤流?

标签 java java-stream

假设我有一个以下对象的流。

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

是否有在单个链中执行以下操作的习惯用法?

  • 给定 Stream<MyObject> ,
  • 查找 some 的最大值.
  • map valuesome是最大值。

好像,

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());

最佳答案

如果您必须一次性完成,您可以编写一个自定义收集器来将流减少到最大元素列表中。这是基于 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 - 如何通过其中的某个最大值过滤流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71673019/

相关文章:

JAVA JNI C 调试器

java - 是否可以确定特定文件夹的内容已更改,并在发生更改时按需运行 ANT 任务?

Java - 按数字和字母分割字符串

Java 流 : Combining two collections into a map

java - Stream.of(item).collect(Collectors.toSomeCollection()) 比 new SomeCollection(Arrays.asList(item)) 快吗?

java - 如何在 java 8 中的流中传播变量

java-8 - 使用 java 8 流 api 进行嵌套查找

迭代 JSONObject 时出现 java.util.concurrentModification 异常

java - JAXB 解码 : unexpected element

loops - 将循环内的复杂条件逻辑转换为流和 lambda