java8函数式编程学习(七)- 高级用法

7. 高级用法

7.1 基本数据类型优化

我们之前用到的很多Stream的方法由于都使用了反省。所以涉及到的参数和返回值都是引用数据类型。
即使我们操作的是整数小数,但是实际用的都是他们的包装类。JDK5引入了自动装箱拆箱让我们在使用对用的包装类时就好像使用基本数据类型一样方便。但是装箱和拆箱的过程肯定是要消耗时间的。虽然宰割时间消耗很少,但是在大量数据不断的重复装箱拆箱的时候,就不可以无视这个时间的消耗了。
所以为了让我们能够对这部分的消耗进行优化。Stream提供了专门针对基本数据类型的方法。
例如:mapToInt、mapToLong、mapToDouble、flatMapToInt、flatMapToDouble等

List<Author> authors = StreamDemo.getAuthors();
authors.stream()
    .map(Author::getAge)
    .map(age -> age +10)
    .filter(age -> age > 10)
    .map(age -> age +2)
    .forEach(System.out::println);

// 优化基本数据类型(拆箱装箱过程消耗较大)
authors.stream()
    .mapToInt(Author::getAge)
    .map(age -> age +10)
    .filter(age -> age > 10)
    .map(age -> age + 2)
    .forEach(System.out::println);

7.2 并行流

当流中有大量元素时,我们可以使用并行流提高操作效率。其实并行流就是把任务分配给多个线程去完成。
如果我们自己实现的话会非常复杂,并且要求对并发编程有足够的认识和理解。
而如果我们使用stream的话,只需要修改一个方法调用就可以使用并行流来实现,从而提高效率(并且是线程安全)。
使用parallel()或者parallelStream()方法

List<Author> authors = StreamDemo.getAuthors();
OptionalInt reduce = authors.stream()
    .parallel() // 实现并行流
    .peek(author -> System.out.println(author.getAge() + "  " + Thread.currentThread().getName())) // 可以用此方法调试并行流
    .mapToInt(Author::getAge)
    .filter(age -> age > 10)
    .reduce((result, ele) -> result + ele);
System.out.println(reduce.getAsInt());

// 这样也可以实现并行流
authors.parallelStream();
posted @ 2022-03-30 10:40  xiexie0812  阅读(370)  评论(0编辑  收藏  举报