/ / Dlaczego samouczek równoległych strumieni Oracle używa nowego ArrayList <> (Arrays.asList (arr))? - java, java-8

Dlaczego samouczek w równoległym strumieniu Oracle używa nowej tablicy ArrayList <> (Arrays.asList (arr))? - java, java-8

The seminarium na równoległych strumieniach tworzy ArrayList przykład z wyjścia Arrays.asList nawet jeśli jest używany jako źródło strumienia i nigdy nie jest do niego dołączony.

Przykładowy kod z samouczka:

Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
List<Integer> listOfIntegers =
new ArrayList<>(Arrays.asList(intArray));

System.out.println("listOfIntegers:");
listOfIntegers
.stream()
.forEach(e -> System.out.print(e + " "));
System.out.println("");

Dlaczego nie po prostu zachować java.util.Arrays.ArrayList (typ wyjścia Arrays.asList)? Czy ma jakieś dziwne właściwości w równoległych strumieniach?

Odpowiedzi:

2 dla odpowiedzi № 1

W tym fragmencie kodu nie ma takiej potrzeby. Myślę, że kod był wynikiem pisarzy początkowa intencja stworzyć ArrayList i wypełnij go pewnymi predefiniowanymi wartościami.

Mogło więc być następujące nastawienie:

Integer[] intArray = { 1, 2, 3, 4, 5, 6, 7, 8 };
List<Integer> listOfIntegers = new ArrayList<>();
for(Integer i: intArray) listOfIntegers.add(i);

lub

Integer[] intArray = { 1, 2, 3, 4, 5, 6, 7, 8 };
List<Integer> listOfIntegers = new ArrayList<>();
Collections.addAll(listOfIntegers, intArray);

Korzystając z tego punktu początkowego, new ArrayList<>(Arrays.asList(intArray)) jest poprawą zarówno zwięzłości, jak i wydajności, ponieważ jego kod źródłowy jest krótszy i pozwala na ArrayList aby dopasować jego wewnętrzną tablicę dokładnie do liczby zawartych elementów.

Łatwo jednak przeoczyć, że ArrayList jest wtedy przestarzały. Na marginesie, możesz także napisać Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)innymi słowy, łatwo jest też przeoczyć, że nawet ręczne tworzenie tablicy nie jest konieczne.

To nie jest niezwykła sytuacja. Napotkałem kod, który ma sens, biorąc pod uwagę jego historię, ale nie dla bezstronnego czytelnika więcej niż okazjonalnie. Dlatego zdecydowanie zaleca się, aby Twój kod był sprawdzany przez kogoś, kto nie zna jego historii, od czasu do czasu.

Jeśli chodzi o przetwarzanie równoległe, zarówno i wynik Arrays.asList mają właściwość bycia wspieranym przez tablicę, pozwalając na losowy dostęp i wytwarzając uporządkowane strumienie, które obsługują dzielenie. The ArrayListPrzetwarzanie równoległe może być nieco mniej wydajne ze względu na kontrole jednoczesnych modyfikacji, które są pokazane przez Ingerencja przykład w tym samouczku. Ten przykład rzeczywiście wymaga ArrayList ponieważ doda do niego elementy. Ponieważ lista wrapperów tablicowych nie obsługuje dodawania, ten przykład nie działałby z tym i nie wymaga takich kontroli.


-3 dla odpowiedzi № 2

Później w próbce kodu Collections.sort(listOfIntegers, reversed); Jest używane.

Od Arrays.asList() tworzy niezmienny List na przykład ta linia zawiodłaby.