java streams:直截了当地减少

Jor*_*rdi 6 java java-8 java-stream

我有一个流MetricGroup,其中:

public class MetricGroup {

    private int uploadedDocs;
    private long uploadedKbs;

    // getters and setters

}
Run Code Online (Sandbox Code Playgroud)

我需要在一个指标中对所有指标进行sumarize.我的意思是,我需要所有添加metric.uploadedDocssumMetric.uploadedDocsmetric.uploadedKdssumMetric.uploadedKbs.

我想我需要某种东西 reduce

Stream.of(new MetricGroup(1,100), new MetricGroup(1,200))
    .reduce(????);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Swe*_*per 7

你可以使用这个重载reduce:

T reduce(T identity,
     BinaryOperator<T> accumulator)
Run Code Online (Sandbox Code Playgroud)

像这样:

.reduce(new MetricGroup(0, 0),
        (x, y) -> new MetricGroup(
                      x.getUploadedDocs() + y.getUploadedDocs()
                      x.getUploadedKbs() + y.getUploadedKbs()
                  )
        )
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下collect方法:

private static MetricGroup combine(MetricGroup x, MetricGroup y) {
    x.setUploadedDocs(x.getUploadedDocs() + y.getUploadedDocs());
    x.setUploadedKbs(x.getUploadedKbs() + y.getUploadedKbs());
    return x;
}

// ....

.collect(() -> new MetricGroup(0, 0),
    YourClass::combine,
    YourClass::combine
)
Run Code Online (Sandbox Code Playgroud)