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

如何使用Java 8 Stream API获取所有variableCount最小的Foo对象

如何用Java 8 Stream获取所有具备最小variableCount的Foo实例

我来帮你解决这个问题!要从Foo对象的Stream里筛选出所有variableCount最小的实例,其实有两种很实用的思路,咱们一步步来看:

方法一:先找最小值,再过滤(直观高效)

这种方法不需要分组,直接分两步处理:先拿到流中最小的variableCount值,再用这个值过滤出所有符合条件的Foo对象。好处是逻辑简单,容易理解,适合只需要筛选最小元素的场景。

代码示例

首先定义Foo类:

class Foo {
    private int variableCount;

    public Foo(int variableCount) {
        this.variableCount = variableCount;
    }

    public int getVariableCount() {
        return variableCount;
    }

    @Override
    public String toString() {
        return "Foo{variableCount=" + variableCount + "}";
    }
}

然后实现筛选逻辑:

import java.util.Arrays;
import java.util.List;
import java.util.OptionalInt;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Foo> foos = Arrays.asList(
            new Foo(3),
            new Foo(2),
            new Foo(1),
            new Foo(1) // 这两个是咱们要的目标元素
        );

        // 第一步:获取流中最小的variableCount值
        OptionalInt minCount = foos.stream()
            .mapToInt(Foo::getVariableCount)
            .min();

        // 第二步:过滤出所有等于最小值的Foo实例
        if (minCount.isPresent()) {
            List<Foo> minFoos = foos.stream()
                .filter(foo -> foo.getVariableCount() == minCount.getAsInt())
                .collect(Collectors.toList());
            
            System.out.println(minFoos); // 输出 [Foo{variableCount=1}, Foo{variableCount=1}]
        }
    }
}

方法二:基于groupingBy后的Map处理(适合已有分组需求)

如果你已经通过groupingBy得到了Map<Integer, List<Foo>>(键是variableCount,值是对应Foo实例的列表),那只需要从这个Map里找到键最小的entry,取出它的值就是目标列表。

代码示例

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Foo> foos = Arrays.asList(
            new Foo(3),
            new Foo(2),
            new Foo(1),
            new Foo(1)
        );

        // 先按variableCount分组
        Map<Integer, List<Foo>> countToFoos = foos.stream()
            .collect(Collectors.groupingBy(Foo::getVariableCount));

        // 找到键最小的entry,取出对应的Foo列表
        Optional<List<Foo>> minFoos = countToFoos.entrySet().stream()
            .min(Comparator.comparingInt(Map.Entry::getKey)) // 按键值升序找最小
            .map(Map.Entry::getValue);

        // 安全处理Optional,避免空指针
        minFoos.ifPresent(System.out::println); // 输出目标列表
    }
}

注意点

  • 两种方法都用了Optional来处理空流的情况(比如原Foo列表为空时,min()会返回空的Optional),避免抛出NoSuchElementException。
  • 第一种方法需要遍历流两次,但对于大多数场景来说,性能差异可以忽略;第二种方法只遍历一次流分组,再遍历Map的entrySet,适合已经需要分组做其他操作的场景。

内容的提问来源于stack exchange,提问作者James Kleeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:33:04