当前位置: 首页 > 知识库问答 >
问题:

java 8 parallelStream(),带sorted()

郑星辰
2023-03-14

JDK 8 EA现在已经推出,我只是想适应lambda和新的流API。我试图用并行流对列表进行排序,但结果总是错误的:

import java.util.ArrayList;
import java.util.List;

public class Test
{
    public static void main(String[] args)
    {
        List<String> list = new ArrayList<>();
        list.add("C");
        list.add("H");
        list.add("A");
        list.add("A");
        list.add("B");
        list.add("F");
        list.add("");

        list.parallelStream() // in parallel, not just concurrently!
            .filter(s -> !s.isEmpty()) // remove empty strings
            .distinct() // remove duplicates
            .sorted() // sort them
            .forEach(s -> System.out.println(s)); // print each item
    }
}

输出:

C
F
B
H
A

请注意,每次输出都是不同的。我的问题是,这是一个错误吗?或者不可能并行排序列表吗?如果是,那么为什么JavaDoc没有声明这一点?最后一个问题,是否有另一个操作的输出会因流类型而异?

共有2个答案

洪彬
2023-03-14

此外,您可以通过这里的一个很好的示例来阅读有关并行性和forEachOrdered的更多信息。总之,在并行流中使用forEachOrdered可能会导致失去并行性的好处。

以下是来自同一资源的示例:

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

System.out.println("listOfIntegers sorted in reverse order:");
Comparator<Integer> normal = Integer::compare;
Comparator<Integer> reversed = normal.reversed(); 
Collections.sort(listOfIntegers, reversed);  
listOfIntegers
    .stream()
    .forEach(e -> System.out.print(e + " "));
System.out.println("");

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

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

System.out.println("With forEachOrdered:");
listOfIntegers
    .parallelStream()
    .forEachOrdered(e -> System.out.print(e + " "));
System.out.println("");

输出为

listOfIntegers:
1 2 3 4 5 6 7 8
listOfIntegers sorted in reverse order:
8 7 6 5 4 3 2 1
Parallel stream:
3 4 1 6 2 5 7 8
Another parallel stream:
6 3 1 5 7 8 4 2
With forEachOrdered:
8 7 6 5 4 3 2 1

第五个管道使用forEachOrdered方法,该方法按照流源指定的顺序处理流的元素,而不管您是串行还是并行执行流。请注意,如果将forEachOrdered这样的操作与并行流一起使用,可能会失去并行性的好处

.

楚方伟
2023-03-14

您需要使用forEachOrdered,而不是forEach。

根据for各个文档:

对于并行流管道,此操作不能保证尊重流的相遇顺序,因为这样做会牺牲并行性的好处。对于任何给定的元素,可以在库选择的任何时间和线程中执行该操作。如果操作访问共享状态,则它负责提供所需的同步。

 类似资料:
  • 有时在我的实践中,我想圆视图的背景角。通常我会用这样的(@drawable/bg_rounded) 但有时我只需要舍入一个角度,并以编程方式完成 我创建了一个测试项目来显示问题。activity_main.xml 主活动类可能类似于 但是意想不到的行为发生了-角落不是圆的点击查看图片 如果我使用背景。转弯半径:可以预测 点击查看图片 所以我的问题是:我应该用什么来实现不同圆角半径的动态调整

  • 代码: 上下文:尝试在JavaScript中使用 编辑: 完整代码: 编辑: 无法获取

  • A370 的腕带更换方便。例如,如果您想让腕带颜色与您的服装搭配,很容易就可实现。 1.将腕带从两侧弯曲(一次一侧),可将其从设备上取下。 2.将设备与腕带拉开。 要安装腕带,以相反的顺序进行步骤操作。确保腕带与设备在两侧齐平适配。

  • A300 的 USB 连接器位于腕带内的设备中。您需要卸下腕带以便利用计算机设置 A300、为电池充电及变更腕带。 从搭扣侧将腕带弯曲从而将其从设备上卸下。 从搭扣侧握住腕带。先从一侧而后再从另一侧将腕带从按钮上方穿过。仅在必要时拉伸腕带。 将设备与腕带拉开。 要安装腕带,以相反的顺序进行步骤操作。

  • 色相环上带有热带风味的色调,一定包括绿松石绿(truquoise)。添加些色彩,使其渐亮,成为绿松石绿——一种冷色系里最温暖的色彩。和其它蓝绿色的明色家族成员在一起,可增加宁静的感觉与讯息。 利用红橙色——绿松石绿的补色——在任一个这些色彩组合里,都有最佳的效果。 就像大自然里的花朵,这些配色设计可强化任一场景,并创造多重祥和宁静、自由自在的感觉。 补色色彩组合 三次色色彩组合 单色色彩组合 16

  • 需配合灯带驱动模块使用。灯带由15颗RGB灯组成,每颗RGB灯都可以被独立的编程,发出指定的颜色。 净重量:20g 体积:500mm 特点 拥有15颗独立可编程RGB灯。