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

理解Java8和Java9中的序列流拆分器与并行流拆分器

易衡
2023-03-14

stream.spliterator()stream.parallel().spliterator()之间的差异:

>

  • 它们可能有不同的特点:

    Stream.of(1L, 2L, 3L).limit(2);            // ORDERED
    Stream.of(1L, 2L, 3L).limit(2).parallel(); // SUBSIZED, SIZED, ORDERED
    

    这里讨论的似乎是另一个毫无意义的流拆分器特性策略(并行计算似乎更好):深入理解Java8和Java9中的拆分器特性

    Stream.of(1L, 2L, 3L);                     // NON NULL
    Stream.of(1L, 2L, 3L).limit(2);            // NULL
    Stream.of(1L, 2L, 3L).limit(2).parallel(); // NON NULL
    
    spliterator = Stream.of(1L, 2L, 3L).limit(2).spliterator();
    stream = StreamSupport.stream(spliterator, true); // No parallel processing!
    

    在本例中,从禁用拆分功能的顺序流创建了一个拆分器(.trysplit()返回null)。当以后需要转换回一个流时,该流不会从并行处理中受益。一种耻辱。

    最大的问题是:作为解决办法,在调用.spliterator()之前总是将流转换为并行流会有什么主要影响?

    // Supports activation of parallel processing later
    public static <T> Stream<T> myOperation(Stream<T> stream) {
        boolean isParallel = stream.isParallel();
        Spliterator<T> spliterator = stream.parallel().spliterator();
        return StreamSupport.stream(new Spliterator<T>() {
            // My implementation of the interface here (omitted for clarity)
        }, isParallel).onClose(stream::close);
    }
    
    // Now I have the option to use parallel processing when needed:
    myOperation(stream).skip(1).parallel()...
    
  • 共有1个答案

    苍志文
    2023-03-14

    这不是拆分器的一般属性,而是封装流管道的包装拆分器的一般属性。

    当您在一个由拆分器生成且没有链接操作的流上调用spliterator()时,您将得到一个源拆分器,该源拆分器可能支持也可能不支持trysplit,而与流paralle的状态无关。

    ArrayList<String> list = new ArrayList<>();
    Collections.addAll(list, "foo", "bar", "baz");
    Spliterator<String> sp1 = list.spliterator(), sp2=list.stream().spliterator();
    // true
    System.out.println(sp1.getClass()==sp2.getClass());
    // not null
    System.out.println(sp2.trySplit());
    

    同样地

    Spliterator<String> sp = Stream.of("foo", "bar", "baz").spliterator();
    // not null
    System.out.println(sp.trySplit());
    
    …
    
       // @@@ Detect if stateful operations are present or not
       //     If not then can split otherwise cannot
    
       /**
        * True if this spliterator supports splitting
        */
       final boolean isParallel;
    
    Spliterator<String> sp = Stream.of("foo", "bar", "baz").map(x -> x).spliterator();
    // null
    System.out.println(sp.trySplit());
    
     类似资料:
    • 我们有一个服务调用,它返回一个id列表,我们用它调用另一个服务,该服务一次只接受一个id,因此我们使用的是驼峰分割器,并行处理转换为。现在,我们通过seda调用该服务,因此可以设置超时。这将导致并行处理不再是并行的问题,因为seda默认只有1个并发使用者在处理它。 选项: < li >放一个?seda上的concurrent consumers = x < li >使用direct而不是seda。

    • 这可能是一个基本问题,但是有人能解释一下和之间的主要区别并给出一些例子吗?

    • 我有一个订单列表,我想使用Java8Stream和Collectors按用户分组。GroupingBy: 这将返回包含用户和订单列表的映射: 我不需要整个对象User,只需要它的username字段,它是一个字符串,所以我想获得如下内容: 我试图使用stream.map将用户映射到username字段,但无法正确实现。我怎样才能尽可能简单地做到这一点呢?

    • 我有下面的spark数据框架。 我必须将上面的数据帧列拆分为多个列,如下所示。 我尝试使用分隔符进行拆分;和限制。但是它也将主题拆分为不同的列。姓名和年龄被组合在一起成一列。我要求所有主题在一列中,只有姓名和年龄在单独的列中。 这在Pyspark有可能实现吗?

    • 我是Camel的新手,网上没有类似的问题让我相信我在做一些愚蠢的事情。我正在使用camel 2.12.1组件,并且正在从本地目录解析大型CSV文件,并通过SFTP下载它们。我发现 拆分(body(). Tokenize("\n")).流().散集(). csv() 适用于本地文件(windows 7);我与 列表 对于csv文件中的每一行。但是,当我从sftp组件(连接到linux服务器下载文件)

    • 使用Camel拆分数组列表,并在多达10个线程中并行处理每个项目。以下是配置。线程池配置文件被设置为最大线程数=10。 bean:reportRepository?method=getPendingTransactions获取ArrayList并传递给Splitter。 是处理项目的处理器。 问题:当作业开始时,它正在启动10个线程,但是一些线程正在拾取同一个项目。例如,如果我在数组列表中有ite