配列の内容を変更するために、List
に変換したい配列があります。
Stack Overflowには、Arrays.asList()
に対処する多くの質問/回答があり、基になる配列のリストビューのみを提供する方法、および結果のリストを操作しようとすると一般にメソッドとしてUnsupportedOperationException
がスローされますリストの操作に使用される(例:add()
、remove()
など)は、Arrays.asList()
が提供するList実装では実装されません。
しかし、配列を可変リストに変換する方法の例を見つけることはできません。配列とput()
をループして新しいリストに入れることができると思いますが、これを行うためのインターフェースが存在するのではないかと思っています。
1つの簡単な方法:
Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));
これにより、可変リストが作成されますが、元の配列のcopyになります。リストを変更するとnot配列が変更されます。もちろん、toArray
を使用して後でコピーすることもできます。
可変viewを配列に作成する場合は、自分で実装する必要があると思います。
また、GoogleコレクションAPIを使用している場合
Lists.newArrayList(myArray)
Java 8に含まれるStream APIを使用したこの簡単なコードは、配列の要素を含む可変リスト(またはビュー)を作成します。
Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
または、同等に有効:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Eclipse Collections (以前の GS Collections )を使用している場合、FastList.newListWith(...)
またはFastList.wrapCopy(...)
を使用できます。
どちらのメソッドも可変引数を使用するため、配列をインラインで作成するか、既存の配列を渡すことができます。
_MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);
Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
_
2つの方法の違いは、配列がコピーされるかどうかです。 newListWith()
は配列をコピーしないため、一定の時間がかかります。配列が他の場所で変更される可能性があることがわかっている場合は、使用しないでください。
_Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
array2[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2);
Integer[] array3 = {1, 2, 3, 4};
MutableList<Integer> list3 = FastList.wrapCopy(array3);
array3[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);
_
注:私はEclipse Collectionsのコミッターです。
Streams APIを使用して別のオプションを追加します。
List<Foo> list = Arrays.stream(array).collect(Collectors.toList());
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));