Java 8 parallelStream findFirst [英] Java 8 parallelStream findFirst

查看:1311
本文介绍了Java 8 parallelStream findFirst的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有这样的工人列表:

Suppose we have a list of workers like this :

List<Worker> workers = new ArrayList<>();
workers.add(new Worker(1));
workers.add(new Worker(2));
workers.add(new Worker(3));
workers.add(new Worker(4));
workers.add(new Worker(5));

我想找到第一个完成工作的工人,所以:

I want to find the first worker who finished his job, so :

Worker first = workers.parallelStream().filter(Worker::finish).findFirst().orElse(null);

但是有问题,我不想等所有工人完成他们的工作然后找到第一个,但第一个工人他一完成工作

but there's a problem, I don't want to wait for all workers to finish their jobs and then find the first, but the first worker As soon as he finished his job!

public class Test {

    public static void main(String[] args) {
        List<Worker> workers = new ArrayList<>();
        workers.add(new Worker(1));
        workers.add(new Worker(2));
        workers.add(new Worker(3));
        workers.add(new Worker(4));
        workers.add(new Worker(5));
        Worker first = workers.parallelStream().filter(Worker::finish).findFirst().orElse(null);
        if (first != null) {
            System.out.println("id : " + first.id);
        }
    }

    static class Worker {

        int id;

        Worker(int id) {
            this.id = id;
        }

        boolean finish() {
            int t = id * 1000;
            System.out.println(id + " -> " + t);
            try {
                Thread.sleep(t);
            } catch (InterruptedException ignored) {
            }
            return true;
        }

    }

}



<是否有任何方法可以使用 java.util.Stream 实现它?

谢谢。

推荐答案

当您使用完成方法作为Stream的过滤器时,这意味着为了评估过滤器对特定Worker的谓词,Worker必须完成它的工作。

When you use your finish method as the filter of the Stream, it means that in order to evaluate the filter's predicate for a specific Worker, the Worker has to finish its work.

然而,当您将此代码作为并行Stream运行时,它可能是过滤器将同时应用于多个Worker,在这种情况下,第一个完成将为您提供输出。但是,您无法控制并行Stream将使用的线程数。它可能决定某些Worker应该在同一个线程上处理,在这种情况下,其中一些将不会被处理(因为你的终端操作只需要一个Worker完成它的处理)。

When you run this code as a parallel Stream, however, it's possible that the filter would be applied on multiple Workers at the same time, in which case, the first one to finish would give you the output. However, you have no control over how many threads the parallel Stream will use. It may decide that some of the Workers should be processed on the same thread, in which case some of them won't be processed at all (since your terminal operation requires that only one Worker finishes its processing).

因此,如果你的目标是同时为所有工人执行完成,你就不能使用Stream(不是并行流)。

Therefore, if your goal is that finish is executed for all Workers at the same time, you can't use a Stream (not even a parallel Stream).

这篇关于Java 8 parallelStream findFirst的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆