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);
調査
- なぜこうなるのか調べてみたところ、以下の stackoverflow の投稿に答えがありました。
- UnsupportedOperationException in AbstractList.remove() when operating on ArrayList
結果
- ということで以下のように書くことにしました
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 を投げています