为什么Oracle并行流教程使用新的ArrayList<>(Arrays.asList(arr))?

时间:2015-05-09 16:43:42

标签: java java-8

并行流上的tutorialSchema & Schema::operator=(const Schema& other){ this->schemaFolder = other.schemaFolder; this->databases = other.databases; this->curDb = other.curDb; return *this; } 的输出创建ArrayList实例,即使它被用作流的源并且从不附加到。{/ p>

教程中的示例代码:

Arrays.asList

为什么不保留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的输出类型)?它在并行流中是否有一些奇怪的属性?

2 个答案:

答案 0 :(得分: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.asList的结果和ArrayList的结果都具有由数组支持的属性,允许随机访问,并生成支持拆分的有序流。 ArrayList的并行处理可能效率稍低,因为检查了并发修改,该教程中的Interference示例对此进行了演示。这个例子确实需要一个dynamic[] test = Console.ReadLine().Split(charSeparators, StringSplitOptions.RemoveEmptyEntries).ToArray();,因为它会为它添加元素。由于数组包装器列表不支持添加,因此该示例不适用于它并且不需要这样的检查。

答案 1 :(得分:-3)

稍后使用代码示例Collections.sort(listOfIntegers, reversed);

由于Arrays.asList()生成一个不可变的List实例,该行将失败。