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の大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^

コメント