如何使用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
相关产品推荐
相关产品推荐

