1.高级用法531.1优化基本数据类型
我们以前使用的许多Stream方法都使用泛型。因此,所涉及的参数和返回值都是引用数据类型。
即使我们操作整数小数,我们实际上使用他们的包装类别。JDK5引入的自动包装和自动拆卸使我们在使用相应的包装类别时使用基本数据类型一样方便。但你必须知道,包装和拆卸必须消耗时间。虽然这个时间消耗了很多。但当大量数据重复包装和拆卸时,您不能忽视此时的损失。
因此,为了优化这部分时间消耗。Stream还为基本数据类型提供了许多方法。
例如:mapToInt,mapToLong,mapToDouble,flatMapToInt,flatMaptoDouble等。
StreamDemo
///stream流的高级用法 53 private static void test30() { List<Author> authors = getAuthors(); authors.stream() .map(author -> author.getAge()) .map(age -> age + 10) .filter(age->age>18) .map(age->age+2) .forEach(System.out::println); }
优化后
//优化后 authors.stream() .mapToInt(author -> author.getAge()///这句话是直接将流中的类型转换为int,避免多次拆箱装箱操作 .map(age -> age + 10) .filter(age->age>18) .map(age->age+2) .forEach(System.out::println);
2.并行流54当流中有大量元素时,我们可以使用并行流来提高操作效率。事实上,并行流是将任务分配到多个线程中。如果我们自己使用代码,它实际上会非常复杂,并要求您对并发编程有足够的理解和理解。如果我们使用Stream,我们只需要修改一种方法来帮助我们实现并行流,从而提高效率。
parallel方法可以将串行流转换为并行流。
//并行流 54 private static void test31() { Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Integer sum = stream.filter(num -> num > 5) .reduce((result, element) -> result + element) .get(); System.out.println(sum); }
并行流对象也可以通过paralelStream直接获得。
//改成并行流 Integer sum = stream.parallel()///此操作用并行流代替流装 //这句话是为了显示每个元素在哪个线程中输出 .peek(num -> System.out.println(num+Thread.currentThread().getName())) .filter(num -> num > 5) .reduce((result, element) -> result + element) .get(); System.out.println(sum);
将test30()改为并行流
使用parallelStream()更简单的写作方法
//改成并行流 54 authors.parallelStream() //parallelStream()更方便的方法成为并行流 .mapToInt(author -> author.getAge()///这句话是直接将流中的类型转换为int,避免多次拆箱装箱操作 .map(age -> age + 10) .filter(age->age>18) .map(age->age+2) .forEach(System.out::println);