java.util.CollecitonのremoveIfメソッドの使い方
Java8からremoveIfメソッドが追加されています。
removeIfメソッドは引数にPredicateを取り、trueの場合のみ要素を削除するメソッドです。いずれかの要素を削除した場合、removeIfはtrueを返し、要素を削除できなかった場合はfalseを返します。
import java.util.ArrayList; import java.util.List; public class RemoveIfSample { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("test1"); list.add("test2"); list.add("answer1"); list.add("answer2"); list.removeIf(e -> e.startsWith("t")); for(int i = 0;i < list.size();i++) { System.out.println(list.get(i)); } } }
ラムダ式で書かなくても、Predicateを定義してremoveIfに渡しても良いです。
Predicate<String> func = new Predicate<String>() { @Override public boolean test(String e) { return e.startsWith("t"); } }; list.removeIf(func);
ConcurrentModificationException例外
拡張for文でListをループし、そのループ内でremoveメソッドを実行すると、ConcurrentModificationException例外が発生します。
import java.util.ArrayList; import java.util.List; import java.util.Objects; public class RemoveIfSample { public static void main(String[] args) { final List<String> list = new ArrayList<>(); list.add("test1"); list.add("test2"); list.add("test3"); list.add("test4"); for (final String item : list) { if (Objects.equals("test2", item)) { list.remove(item); } } } }
結果は以下のように例外が発生します。
Exception in thread "main" java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996) at jp.co.stream.RemoveIfSample.main(RemoveIfSample.java:15)
このようなことが発生するのでJava8以上ならremoveIfメソッドを使用、Java7以下ならイテレータを使用すれば安全に要素を削除することが出来ます。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント