首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8 parallelStream机制

Java8 parallelStream机制
EN

Stack Overflow用户
提问于 2019-10-31 03:07:19
回答 1查看 72关注 0票数 0

有没有办法使用java8 lambda并行处理每个类属性?

例如,对于给定的Car.java:

代码语言:javascript
复制
public class Car{
    private String color;
    private String model;
    private float value;
    private float tax;
    // and others attributes
    .
    .
    .
    // Getters and Setters
}

我想在颜色,型号,价值,税收等方面做一些并行的处理。因此,基本上希望的逻辑是:

代码语言:javascript
复制
parallel processing:
    - color
    - model
    - value
    - tax

then join and update Car.java object instance fields. 

请注意,此问题与cars实例的数量无关。可能只有一个,也可能有多个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-31 03:53:10

我很好奇,那会是什么样子。假设约束成立,每个属性的处理彼此独立,这将是利用parallelStream()的一种方式。但我非常怀疑,由于并行机器的开销,这是否会带来回报。使用reactive streams,比如RxJava,可以让它变得更加怪异。

代码语言:javascript
复制
public class Car{
    public String color;
    public String model;
    public float value;
    public float tax;

    public Car(String color, String model, float value, float tax) {
        this.color = color;
        this.model = model;
        this.value = value;
        this.tax = tax;
    }

    @Override
    public String toString() {
        return "Car{" +
                "color='" + color + '\'' +
                ", model='" + model + '\'' +
                ", value=" + value +
                ", tax=" + tax +
                '}';
    }
}

@Test
public void process() {
    List<Consumer<Car>> processors = Arrays.asList(
            c -> c.color = printThread(c.color.toLowerCase()),
            c -> c.model = printThread(c.model.toLowerCase()),
            c -> c.value = printThread(c.value * c.value),
            c -> c.tax = printThread(c.tax / c.tax));

    Arrays.asList(new Car("Red", "AlphaGorilla", 1f, 0.5f), new Car("Blue", "Bloated++", 10f, 0.2f))
            .parallelStream().forEach(c -> {
        System.out.println(c);
        processors.parallelStream().forEach(p -> {
            p.accept(c);
            fakeExpensiveComputation();
        });
        System.out.println(c);
    });
}

private <T> T printThread(T smthg) {
    System.out.println(String.format("Calculated value %s in thread %d", smthg.toString(), Thread.currentThread().getId()));
    return smthg;
}

private void fakeExpensiveComputation() {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        throw new RuntimeException();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58632172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档