読者です 読者をやめる 読者になる 読者になる

Arrays.asList が固定長のリストを返すことを忘れてはならない

Java

訳あって String を確実に作れるカンマ区切りの文字列と単独の宣言済の String 数個 から
単独の宣言済の String を先頭に、String
を作ることに少し悩みました。

例えば、、

String str = "a,b,c";
String h1 = "1";
String h2 = "2";
String h3 = "3";

String[] ary = Arrays.stream(str.split(","))
.collect(()->Arrays.asList(h1, h2, h3), (t, u)->t.add(u), (t,r)->r.addAll(t))
.toArray(new String[]{});

と思いつきで考えたのですが、これは、Arrays.asList が、固定長のリストを返してしまうので
その後の add で UnsupportedOperationException が発生してしまいます。

しかたなく、終端操作の Supplier の中で Stream で Listを生成してやることにしました。

String[] ary = Arrays.stream(str.split(","))
.collect(()->Arrays.stream(new String[]{h1, h2, h3}).collect(Collectors.toList())
        , (t, u)->t.add(u)
        , (t,r)->r.addAll(t)
).toArray(new String[]{});