并行流上的tutorial从Schema & 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
的输出类型)?它在并行流中是否有一些奇怪的属性?
答案 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
实例,该行将失败。