java.util.CollecitonのremoveIfメソッドの使い方

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以下ならイテレータを使用すれば安全に要素を削除することが出来ます。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました