扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇文章为大家展示了如何在Java中使用Collection方法 移除元素,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
成都创新互联于2013年成立,先为白水等服务建站,白水等地企业,进行企业商务咨询服务。为白水企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。1. 前言
操作集合是一个 Java 编程人员几乎每天都在重复的事情。今天我们来研究一下从 Java Collection 中删除元素的方法。我构建了一个简单的集合,我们以此为例子来展开探索。
Listservers = new ArrayList<>(); servers.add("Felordcn"); servers.add("Tomcat"); servers.add("Jetty"); servers.add("Undertow"); servers.add("Resin");
2. for 循环并不一定能从集合中移除元素
让我们使用传统的 foreach 循环移除 F 开头的假服务器,但是你会发现这种操作引发了 ConcurrentModificationException 异常。
// 错误的示范 千万不要使用 for (String server : servers) { if (server.startsWith("F")) { servers.remove(server); } }
难道 for 循环就不能移除元素了吗?当然不是!我们如果能确定需要被移除的元素的索引还是可以的。
// 这种方式是可行 for (int i = 0; i < servers.size(); i++) { if (servers.get(i).startsWith("F")) { servers.remove(i); } }
但是这种方式我目前只演示了 ArrayList,其它的类型并没有严格测试,留给你自己探索。
3. 迭代器 Iterator 可以删除集合中的元素
在传统方式中我们使用 Iterator 是可以保证删除元素的:
Iteratoriterator = servers.iterator(); while (iterator.hasNext()) { String next = iterator.next(); if (next.startsWith("F")) { iterator.remove(); } }
4. 遍历删除元素的缺点
我们需要遍历集合的每一个元素并对它们进行断言,哪怕你删除一个元素。
尽管我们可以通过迭代的方式删除特定的元素,但是操作繁琐,根据集合类型的不同有潜在的 ConcurrentModificationException 异常。
根据数据结构的不同,删除元素的时间复杂度也大大不同。比如数组结构的 ArrayList 在删除元素的速度上不如链表结构的 LinkedList。
5. 新的集合元素删除操作
Java 8 提供了新的集合操作 API 和 Stream 来帮助我们解决这个问题。我在以前的文章中已经介绍了 Java 8 Stream API,如果有兴趣可以去看看。
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 断言会把符合断言的流元素汇集成一个新的流,然后归纳起来即可,于是我们可以这么写:
// 跟以上不同的是 该方式中的断言是取反的操作。 ListnewServers = servers.stream().filter(s -> !s.startsWith("F")).collect(Collectors.toList());
这个优点上面已经说了不会影响原始数据,生成的是一个副本。缺点就是可能会有内存占用问题。
5.2.2 通过 Collectors.partitioningBy 归纳
这种方法虽然可以满足需要但是我感觉有点投机取巧的成份。Collectors.partitioningBy() 方法本意是做二分类的。该方法会将流中符合断言的、不符合断言的元素分别归纳到两个 key 分别为 true 和 false 的 Map 中,我们可以归类得到符合和不符合的元素集。实现如下:
Map> f = servers.stream().collect(Collectors.partitioningBy(s -> !s.startsWith("F"))); List trues = f.get(Boolean.TRUE); System.out.println("不以 F 开头的: " + trues); List falses = f.get(Boolean.FALSE); System.out.println("以 F 开头的: " + falses);
Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。
上述内容就是如何在Java中使用Collection方法 移除元素,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联网站建设公司行业资讯频道。
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流