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