如何在Java中使用收集方法移除元素

  介绍

本篇文章为大家展示了如何在Java中使用收集方法移除元素,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强> 1。前言

操作集合是一个Java编程人员几乎每天都在重复的事情。今天我们来研究一下从Java集合中删除元素的方法。我构建了一个简单的集合,我们以此为例子来展开探索。

, List, servers =, new  ArrayList<在();   ,servers.add (“Felordcn");   ,servers.add (“Tomcat");   ,servers.add (“Jetty");   ,servers.add (“Undertow");   ,servers.add (“Resin");

<强> 2。为循环并不一定能从集合中移除元素

让我们使用传统的foreach循环移除F开头的假服务器,但是你会发现这种操作引发了ConcurrentModificationException异常。

,//,错误的示范,千万不要使用   ,for  (String  server :服务器),{   ,if  (server.startsWith (“F")), {   ,servers.remove(服务器);   ,}   以前,}

难道为循环就不能移除元素了吗?当然不是!我们如果能确定需要被移除的元素的索引还是可以的。

,//,这种方式是可行   ,for  (int 小姐:=,0;,小姐:& lt;, servers.size();,我+ +),{   ,if  (servers.get (i) .startsWith (“F")), {   ,servers.remove(我);   ,}   }

但是这种方式我目前只演示了ArrayList,其它的类型并没有严格测试,留给你自己探索。

<强> 3。迭代器迭代器可以删除集合中的元素

在传统方式中我们使用迭代器是可以保证删除元素的:

, Iterator, iterator =, servers.iterator ();      ,while  (iterator.hasNext ()), {   String 才能;next =, iterator.next ();   if 才能;(next.startsWith (“F")), {   iterator.remove才能();   ,,}   以前,}

<强> 4。遍历删除元素的缺点

<李>

我们需要遍历集合的每一个元素并对它们进行断言,哪怕你删除一个元素。

<李>

尽管我们可以通过迭代的方式删除特定的元素,但是操作繁琐,根据集合类型的不同有潜在的ConcurrentModificationException异常。

<李>

根据数据结构的不同,删除元素的时间复杂度也大大不同,比如数组结构的ArrayList在删除元素的速度上不如链表结构的LinkedList。

<强> 5。新的集合元素删除操作

Java 8提供了新的集合操作API和流来帮助我们解决这个问题。我在以前的文章中已经介绍了Java 8流API,如果有兴趣可以去看看。

<强> 5.1 Collection.removeIf()

新集合的API removeIf (Predicate<?超级E>过滤器)。该Api提供了一种更简洁的使用谓词(断言)删除元素的方法,于是我们可以更加简洁的实现开始的需求:

<代码> servers.removeIf (s→s.startsWith (“F"));

同时根据测试,ArrayList和LinkedList的性能接近。一般推荐使用这种方式进行操作。

<强> 5.2流实现移除元素

和上面所有移除操作不同的是,其实任何操作都不会改变流源,我们仅仅是使用流Api操作数据源的副本。遵循了数据源→中间操作→归纳终止的生命周期。我们来看看使用流如何实现我们的意图。

<强> 5.2.1通过过滤器断言实现

我们可以使用流的过滤断言.filter断言会把符合断言的流元素汇集成一个新的流,然后归纳起来即可,于是我们可以这么写:

//,跟以上不同的是,该方式中的断言是取反的操作。   List

这个优点上面已经说了不会影响原始数据,生成的是一个副本。缺点就是可能会有内存占用问题。

<强> 5.2.2通过收藏家。partitioningBy归纳

这种方法虽然可以满足需要但是我感觉有点投机取巧的成份.Collectors.partitioningBy()方法本意是做二分类的。该方法会将流中符合断言的,不符合断言的元素分别归纳到两个关键分别为真和假的地图中,我们可以归类得到符合和不符合的元素集。实现如下:

Map<布尔,,List祝辞,f =, servers.stream () .collect (Collectors.partitioningBy (→s  ! s.startsWith (“F")));   ,   ,List trues =, f.get (Boolean.TRUE);   ,System.out.println(“不以,F 开头的:,,,+,机械复制);      ,List

如何在Java中使用收集方法移除元素