2020你还不会Java8新特性? (7)

image-20200104172608140

注意事项:流被重复使用了,或者流被关闭了,就会出异常。

如何避免:使用方法链的方式来处理流。 具体出现的原因,后续进行详细的源码讲解。

举例 :中间操作(惰性求值) 和中止操作(及早求值)本质的区别 public static void main(String[] args) { List<String> list = Arrays.asList("hello", "world", "hello world"); //首字母转大写 list.stream().map(item ->{ String s = item.substring(0, 1).toUpperCase() + item.substring(1); System.out.println("test"); return s; }).forEach(System.out::println); //没有遇到中止操作时,是不会执行中间操作的.是延迟的 // 遇到.forEach() 中止操作时,才会执行中间操作的代码 } 举例:流使用顺序不同的区别 //程序不会停止 IntStream.iterate(0,i->(i+1)%2).distinct().limit(6).forEach(System.out::println); //程序会停止 IntStream.iterate(0,i->(i+1)%2).limit(6).distinct().forEach(System.out::println); Stream底层深入

和迭代器不同的是,Stream可以并行化操作,迭代器只能命令式地、串行化操作

当使用穿行方式去遍历时,每个item读完后再读下一个item

使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。

Stream的并行操作依赖于Java7中引入的Fork/Join框架。

流(Stream)由3部分构成:

源(Source)

零个或多个中间操作(Transforming values)(操作的是谁?操作的是源)

终止操作(Operations)(得到一个结果)

内部迭代和外部迭代

描述性的语言:sql和Stream的对比

select name from student where age > 20 and address = 'beijing' order by desc;

===================================================================================

Student.stream().filter(student -> student.getAge >20 ).filter(student -> student.getAddress().equals("beijing")).sorted(..).forEach(student -> System.out.println(student.getName));

上述的描述,并没有明确的告诉底层具体要怎么做,只是发出了描述性的信息。这种流的方式就叫做内部迭代。针对于性能来说,流的操作肯定不会降低性能。

外边迭代举例: jdk8以前的用的方式。

List list = new ArrayList<>();

for(int i = 0 ;i <= students.size();i++){

​ Student student = students.get(i);

If(student.getAge() > 20 )

​ list.add(student);

}

Collections.sort(list.....)

list.forEach().....

Stream的出现和集合是密不可分的。

集合关注的是数据与数据存储本身,流关注的则是对数据的计算。

流与迭代器类似的一点是:流是无法重复使用或消费的。

如何区分中间操作和中止操作:

中间操作都会返回一个Stream对象,比如说返回Stream,Stream,Stream;

中止操作则不会返回Stream类型,可能不返回值,也可能返回其他类型的单个值。

并行流的基本使用 举例: 串行流和并行流的简单举例比较 public static void main(String[] args) { // 串行流和并行流的比较 List<String> list = new ArrayList<>(5000000); for (int i = 0; i < 5000000; i++) { list.add(UUID.randomUUID().toString()); } System.out.println("开始排序"); long startTime = System.nanoTime(); // list.parallelStream().sorted().count(); //串行流 list.parallelStream().sorted().count(); //并行流 long endTime = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(endTime - startTime); System.out.println("排序时间为: "+ millis); }

image-20200104183834756

image-20200104183924340

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwgpf.html