2015-05-09 17 views
2

並行流上的tutorialArrays.asList的輸出創建ArrayList實例,即使它用作流的源並且從不附加到。從教程爲什麼Oracle並行流教程使用新的ArrayList <>(Arrays.asList(arr))?

示例代碼:

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(""); 

爲什麼不保持java.util.Arrays.ArrayList(的Arrays.asList輸出型)?並行流中是否有一些奇怪的屬性?

+8

在這種情況下,沒有意義。甚至可以使用'Arrays.stream(intArray)'。 – Bubletan

+0

同意。這只是一個片段。在本教程的其他部分,他們在'List'上進行操作(對其進行排序,用於創建多個流)。 –

+0

您可以在http://bugreport.java.com/上發佈教程的錯誤/ RFE,或者向mailto:[email protected]發送改進建議。如果您發佈錯誤,請使用類別文檔/教程。 –

回答

-3

後面的代碼示例使用Collections.sort(listOfIntegers, reversed);

由於Arrays.asList()產生不可變的List實例,該行將失敗。

+3

不完全不可變:您可以使用'set',但不能'添加'它。 –

+1

'Arrays.asList'返回一個具有固定大小的'List',但對它進行排序是完全正確的。 http://ideone.com/y8cJvT – Radiodef

2

在這個代碼片段中,不需要它。我想,代碼是作家的初始意圖創建ArrayList並填充一些預定義值的結果。

因此,有可能是以下心態:

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

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

使用這個出發點,new ArrayList<>(Arrays.asList(intArray))是在這兩個改進,簡潔和效率,它的源代碼是短,它允許ArrayList根據包含的元素的數量精確調整其內部數組的大小。

但是,很容易忽視ArrayList已過時。另外,還可以編寫Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8),換句話說,即使手動創建數組也不是必須的。

這不是一個不尋常的情況。我遇到的代碼在給定歷史的情況下是有道理的,但對於不偏不倚的讀者來說,不是偶爾的。這就是爲什麼強烈建議讓您的代碼不時得到不知道其歷史記錄的人員的評論。

關於並行處理,Arrays.asListArrays.asList的結果均具有由數組支持的特性,允許隨機訪問並生成支持分裂的有序流。 ArrayList的並行處理可能會稍微低效,因爲該教程中的Interference示例演示了對併發修改的檢查。這個例子確實需要一個ArrayList,因爲它會向它添加元素。由於數組封裝器列表不支持添加,因此該示例不適用於它,並且不需要這種檢查。

相關問題