java的stream流合并和流聚集

72 阅读1分钟

1.stream流合并,我们就拿计算1-10的所有数之和来举例子。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,7,8,9);
int sum = integers.stream().reduce((a,b) -> a + b).get();
//下面的这种写法也是对的。
int sum1 = integers.stream().reduce(Integer::sum).get();
//上面的则是调用的Integer类里面的sum求和方法,这种双冒号运算符则是直接省略了参数.

除此之外,stream流还可以操作对象,但是记住我们下面之所以要New一个对象充当缓存对象则是为了防止集合里面的第一个元素被缓存而导致错误。直接看代码例子:

Student result = students.stream()
    .reduce(new Student("", 0),
        (a, b) -> {
            a.setMidtermScore(a.getMidtermScore() + b.getMidtermScore());
            return a;
        }
    );

System.out.println(result.getName() + " - " + result.getMidtermScore());

最后就是流的收集,这个需要调用Collectors类里面的toList()方法。

import java.util.stream.Collectors;

List<String> numResult = numbers.stream()
    .sorted((n1, n2) -> n2 - n1)
    .limit(3)
    .map(a -> "" + a)
    .collect(Collectors.toList());

String string = String.join("-", numResult);
System.out.println("字符串是: " + string);

2.并行流则就是将上述的stream改成parallelStream,但是并行流并不一定比串行流效率高,主要原因有 (1).当CPU硬件不是很好的状况下并不适合用并行流,因为并行流的实现也需要等待CPU的资源。 (2).如果任务太过于简单,则也不适合并行流,因为并行流的实现本身就需要开销。 另外,注意的是任务执行事件超过一个小时的情况下推荐用并行流如果采用的数据有逻辑关系,则还是采用串行流更好