Arrays.asList と List#removeIf の組み合わせ

Java 8 で Arrays.asList と List#removeIf で少しハマったのでメモを残しておきます。

現象

  • Java8 で以下のようなコードを書くと java.lang.UnsupportedOperationException が投げられます。
  String[] languages = {"Java", "Ruby", "JavaScript", "Haskell", "Perl", "C", "C++", "Perl", "Go"};
  List<String> list = Arrays.asList(languages);
  list.removeIf(lang -> lang.length() <= 5);

調査

結果

  • ということで以下のように書くことにしました
  String[] languages = {"Java", "Ruby", "JavaScript", "Haskell", "Perl", "C", "C++", "Perl", "Go"};
  List<String> list = new ArrayList<>( Arrays.asList(languages) );
  list.removeIf(lang -> lang.length() <= 5);

*1:正確には抽象クラス AbstractList を実装したもので、これの remove が UnsupportedOperationException を投げています