一、背景
今天在看同事写的代码的时候,看到了一个我很少使用的集合操作,一般我习惯过滤集合的数据的时候,采用stream
流当中的filter
操作,但是同事使用的是removeIf
,对此简单看了看两者的区别,对此进行记录一下。
二、比较
2.2 相同点
removeIf
和stream
流的filter
它们都能实现过滤/删除集合中元素的功能。
2.2 不同点
removeIf
是List
接口的方法,主要用于移除满足特定条件的元素。它适用于需要直接在原集合上进行修改的场景,例如删除满足某个条件的记录。stream
的filter
是Stream
接口的方法,主要用于创建一个新的流,其中包含满足给定条件的元素。它适用于需要对数据进行进一步处理或转换的场景,例如筛选出满足某个条件的数据并生成新的集合。
removeIf
和stream
流的filter
都能实现过滤功能,但removeIf
会改变原集合,而filter
不会。
2.3 效率比较
removeIf
的效率取决于底层集合的实现。对于ArrayList
等基于数组的集合,removeIf
的时间复杂度为O(n)
,因为它需要遍历整个集合来找到要删除的元素。而对于LinkedList
等基于链表的集合,removeIf
的时间复杂度为O(n^2)
,因为每次删除元素时都需要更新链表的结构。stream
的filter
的效率通常较高,因为它是基于函数式编程的思想设计的。在执行过程中,它会将原始数据转换为一个中间数据流,然后通过过滤条件对中间数据流进行过滤,最后再将过滤后的数据流转换为最终结果。这种设计方式可以有效地减少不必要的计算和内存占用,从而提高程序的性能。
三、代码示例
// 使用removeIf删除满足条件的元素List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));numbers.removeIf(num -> num % 2 == 0); // 删除偶数System.out.println(numbers); // 输出 [1, 3, 5]// 使用stream的filter筛选出满足条件的数据并生成新的集合List<Integer> evenNumbers = numbers.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());System.out.println(evenNumbers); // 输出 [2, 4]
四、总结
• removeIf
适用于直接在原集合上进行修改的场景,而stream
的filter
适用于需要对数据进行进一步处理或转换的场景。
• removeIf
的效率取决于底层集合的实现,而stream
的filter
通常具有较高的效率。
• 在使用removeIf
时,需要注意其直接修改原集合的特性;而在使用stream
的filter
时,可以通过collect
方法将过滤后的数据收集到新的集合中。