
一、介绍
这段代码展示的其实是一个非常典型的场景:如何用 Java 8 的 Stream 流高效过滤集合中的元素。咱们直接看代码——先创建一个包含 10 个 User 对象的列表,每个对象里都有 id 和 name 两个字段。接着定义了一个 Integer 类型的数组 arr,里面存放了我们需要筛选的 id 值:1、2、5、6、9。
核心操作很简单:通过 stream() 把列表转换为流,然后使用 filter 方法进行过滤,过滤条件中用 Arrays.asList(arr).contains(item.getId()) 来判断当前元素的 id 是否存在于目标数组中。最后使用 collect(Collectors.toList()) 将结果收集为新的列表,再通过 forEach 遍历打印。
但这里面藏着一个极易踩坑的细节——注释里特意标出来了:数组类型必须使用 Integer 包装类型,绝对不能写成基本类型 int[]。为什么?因为 Arrays.asList 方法接收的是泛型参数,如果你传入一个 int[],它会被当作一个单独的元素来处理,contains 方法就永远无法匹配到你想要的 id。换句话说,整个过滤逻辑会直接失效。这个细节若不留意,线上排查可能耗费大半天时间。
二、代码
下面就是完整的测试代码,可以直接运行。
@Test
public void listFilter() {
List list = new ArrayList<>();
list.add(new User(1, "a"));
list.add(new User(2, "b"));
list.add(new User(3, "c"));
list.add(new User(4, "d"));
list.add(new User(5, "e"));
list.add(new User(6, "f"));
list.add(new User(7, "g"));
list.add(new User(8, "h"));
list.add(new User(9, "i"));
list.add(new User(10, "j"));
// 注意:数组类型必须使用 Integer 才能正确判断,若用 int 会导致过滤失败
Integer[] arr = new Integer[]{1,2,5,6,9};
List filterList = list.stream()
.filter(item -> Arrays.asList(arr).contains(item.getId()))
.collect(Collectors.toList());
filterList.stream().forEach(System.out::println);
}
