今回は、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」が発生します。(固定長さのリストを返却するため)
