其他分享
首页 > 其他分享> > Jdk8新特性

Jdk8新特性

作者:互联网

一.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