ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Jdk8新特性

2022-07-03 16:31:06  阅读:182  来源: 互联网

标签:分割 元素 System spliterator Jdk8 特性 println out


一.lambda表达式

lambda是用来代替匿名内部类,实现函数式接口的。编码时,我们一般尽可能轻量级的将代码封装为数据,传统的解决方案是通过接口和实现类(匿名内部类)实现,这中方式存在语法冗余,this关键字,变量捕捉,数据控制等问题。

lambda表达式仅能放入如下代码: 预定义使用了 @FunctionalInterface 注释的函数式接口,自带一个抽象函数的方法,或者SAM(Single Abstract Method 单个抽象方法)类型。这些称为lambda表达式的目标类型,可以用作返回类型,或lambda目标代码的参数。例如,若一个方法接收Runnable、Comparable或者 Callable 接口,都有单个抽象方法,可以传入lambda表达式。类似的,如果一个方法接受声明于 java.util.function 包内的接口,例如 Predicate、Function、Consumer 或 Supplier,那么可以向其传lambda表达式。

list.forEach(n -> System.out.println(n)); 
list.forEach(System.out::println);  // 使用方法引用

 

二.stream

流操作是Java8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作。同时stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是惰性取值,只有等到用户真正需要结果的时候才会执行。并且对于现在调用的方法,本身都是一种高层次构件,与线程模型无关。因此在并行使用中,开发者们无需再去操 心线程和锁了。Stream内部都已经做好了。

常用方法

参考

1、筛选

对于集合的操作,经常性的会涉及到对于集中符合条件的数据筛选,Stream中对于数据筛选两个常见的API: filter(过滤)、distinct(去重)

2、切片

2.1基于limit()实现数据截取

2.2基于skip()实现数据跳过

3、映射

基于map()

4、匹配

4.1基于anyMatch()判断条件至少匹配一个元素

4.2基于allMatch()判断条件是否匹配所有元素

5、查找

5.1基于findAny()查找任意一个元素

5.2基于findFirst()查找第一个元素

6、归约

到现在截止,对于流的终端操作,我们返回的有boolean、Optional和List。但是在集合操作中,我们经常会涉及 对元素进行统计计算之类的操作,如求和、求大值、小值等,从而返回不同的数据结果。

6.1基于reduce()进行累积求和 

6.2获取流中元素的最大值、最小值

7、收集器

通过使用收集器,可以让代码更加方便的进行简化与重用。其内部主要核心是通过Collectors完成更加复杂的计算 转换,从而获取到终结果。并且Collectors内部提供了非常多的常用静态方法,直接拿来就可以了。比方说: toList。

8、分组

在数据库操作中,经常会通过group by对查询结果进行分组。同时在日常开发中,也经常会涉及到这一类操作, 如通过性别对学生集合进行分组。如果通过普通编码的方式需要编写大量代码且可读性不好。

对于这个问题的解决,java8也提供了简化书写的方式。通过 Collectors.groupingBy()即可。

8.1多级分组

8.2多级分组变形

 

三、分割迭代器(Spliterator)

分割迭代器主要是用来对源数据元素进行遍历和分区。分割迭代器的源数据可以是数组、集合、IO通道以及生成器函数(比如Stream的iterate方法)。
分割迭代器遍历元素有两种方式:①通过tryAdvance方法单个元素的遍历。②通过forEachRemaining方法顺序的按块遍历。

分割迭代器可以调用trySplit方法,分割元素成为另一个分割迭代器。在某些情况下使用并行的分割迭代器的操作可能效果并不是太好,比如元素不能再分割,分割的元素数量不平衡,分割的效率比较低等。每一个分割迭代器只对本块的元素有用。

 1 List<String> list=new ArrayList<>();
 2         for (int i = 0; i < 100; i++) {
 3             list.add(i+"");
 4         }
 5         Spliterator<String> spliterator = list.spliterator();
 6         Spliterator spliterator1=spliterator.trySplit();  //分割成大小相同的两个分割迭代器
 7         Spliterator spliterator2=spliterator.trySplit();
 8         System.out.println("======spliterator.tryAdvance====");
 9         spliterator.tryAdvance(s -> System.out.print(s+" ")); //单个元素遍历
10         spliterator.tryAdvance(s -> System.out.print(s+" "));
11         System.out.println();
12         System.out.println("======spliterator====");
13         spliterator.forEachRemaining(s -> System.out.print(s+" "));//所有元素遍历
14         System.out.println();
15         System.out.println("======spliterator1====");
16         spliterator1.forEachRemaining(s -> System.out.print(s+" "));
17         System.out.println();
18         System.out.println("======spliterator2====");
19         spliterator2.forEachRemaining(s -> System.out.print(s+" "));

输出如下:

======spliterator.tryAdvance====
75 76 
======spliterator====
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
======spliterator1====
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 
======spliterator2====
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 

标签:分割,元素,System,spliterator,Jdk8,特性,println,out
来源: https://www.cnblogs.com/SEU-ZCY/p/16440062.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有