Java removeIf使い方

今回は、java8のListに追加された「removeIf」の使い方について見ていきたいと思います。


状況

リストをルーフで回しながら特定の条件に該当の場合、その項目(値)を削除したい。

特定条件:1から10の数字の中で、2で割ってあまりが0の項目を削除

  public static void main(String[] args) {

    List<Integer> numbers = IntStream.rangeClosed(1, 10)
            .boxed()
            .collect(Collectors.toList());

    List<Integer> result = numbers.stream().filter(num -> num % 2 != 0)
            .collect(Collectors.toList());

    System.out.println(result);

  }

上記のようにすることもできるかと思いますが、filterを使用したため、結果リストを定義しました。(filterの場合は、元のリストは変わらないです。)

  public static void main(String[] args) {

    List<Integer> numbers = IntStream.rangeClosed(1, 10)
            .boxed()
            .collect(Collectors.toList());

    for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) {
      Integer num = iterator.next();
      if (num % 2 == 0) {
        iterator.remove();
      }
    }

    System.out.println(numbers);

  }

Iteratorを使い、リストの項目を削除するのではなくiterator.remove()を使いました。理由としては、リスト(numbers)とiteratorは同期していないためiterator.remove()使う必要があります。でも、ソースコードが複雑になりましたね。

それで追加されたのが「List.removeIf」です。


List.removeIf

default boolean removeIf(Predicate<? super E> filter)

上記のように「removeIf」は引数としてPredecateを受け取っています。

  public static void main(String[] args) {

    List<Integer> numbers = IntStream.rangeClosed(1, 10)
            .boxed()
            .collect(Collectors.toList());

    numbers.removeIf(num -> num % 2 == 0);

    System.out.println(numbers);

  }

「numbers.removeIf(num -> num % 2 == 0);」この1行ですみました。「removeIf」というメソッド名を見ると何を行うのか分かりやすいです。

なお、removeIfの戻り値の型はブリアンで元のリストが変わります。

なので、List.ofやArrays.asListから返却されたリストで使用する場合は「UnsupportedOperationException」が発生します。(固定長さのリストを返却するため)

コメントを残す