Java Collection 移除元素的几种方式
2021-03-30 18:28
标签:http collect 根据 一个 list() follow resin 性能 tom 操作集合是一个 Java 编程人员几乎每天都在重复的事情。今天我们来研究一下从 Java Collection 中删除元素的方法。我构建了一个简单的集合,我们以此为例子来展开探索。 让我们使用传统的 难道 for 循环就不能移除元素了吗?当然不是!我们如果能确定需要被移除的元素的索引还是可以的。 但是这种方式我目前只演示了 在传统方式中我们使用 Java 8 提供了新的集合操作 API 和 Stream 来帮助我们解决这个问题。我在以前的文章中已经介绍了 Java 8 Stream API[1],如果有兴趣可以去看看。 新的 同时根据测试, 和上面所有移除操作不同的是,其实任何操作都不会改变 我们可以使用 这个优点上面已经说了不会影响原始数据,生成的是一个副本。缺点就是可能会有内存占用问题。 这种方法虽然可以满足需要但是我感觉有点投机取巧的成份。 一般该方式不推荐在此场景使用,它并不符合该 Api 的设计意图。 今天我们研究了一些从 [1]Java 8 Stream API: https://www.felord.cn/java8streamapi.html Java Collection 移除元素的几种方式 标签:http collect 根据 一个 list() follow resin 性能 tom 原文地址:https://blog.51cto.com/14901317/2525162
List
2. for 循环移除元素
foreach
循环移除 F
开头的假服务器,但是你会发现这种操作引发了 ConcurrentModificationException
异常。
// 错误的示范 千万不要使用 for (String server : servers) { if (server.startsWith("F")) { servers.remove(server); } }
// 这种方式是可行 for (int i = 0; i
ArrayList
,其它的类型并没有严格测试,留给你自己探索。3. 迭代器 Iterator 移除元素
Iterator
是可以保证删除元素的:
Iterator
4. 遍历删除元素的缺点
ConcurrentModificationException
异常。ArrayList
在删除元素的速度上不如链表结构的 LinkedList
。5. 新的集合元素删除操作
5.1 Collection.removeIf()
Collection
Api removeIf(Predicate<? super E> filter)
。该 Api 提供了一种更简洁的使用 Predicate
(断言)删除元素的方法,于是我们可以更加简洁的实现开始的需求:
servers.removeIf(s-> s.startsWith("F"));
ArrayList
和 LinkedList
的性能接近。一般推荐使用这种方式进行操作。5.2 Stream 实现移除元素
Stream
源,我们仅仅是使用 Stream
Api 操作数据源的副本。遵循了 数据源 -> 中间操作 -> 归纳终止
的生命周期。我们来看看使用 Stream
如何实现我们的意图。5.2.1 通过 filter 断言实现
Stream
的 filter
断言。filter
断言会把符合断言的流元素汇集成一个新的流,然后归纳起来即可,于是我们可以这么写:
// 跟以上不同的是 该方式中的断言是取反的操作。List
5.2.2 通过 Collectors 归纳
Collectors.partitioningBy()
方法本意是做二分类的。该方法会将流中符合断言的、不符合断言的元素分别归纳到两个 key
分别为 true
和 false
的 Map
中,我们可以归类得到符合和不符合的元素集。实现如下:
Map
6. 总结
Collections
中删除元素的方法 及其注意事项。参考资料
文章标题:Java Collection 移除元素的几种方式
文章链接:http://soscw.com/index.php/essay/70110.html