一、lambda表达式:
本质:作为接口的实例对象(函数式接口,有且仅有一个抽象方法)
1.举例:(o1,o2) -> Integer.compare(o1,o2);2.格式:
->:Lambda操作符或箭头操作符
->左边: Lambda形参列表(其实就是接口中的抽象方法的形参列表)
->右边: Lambda体(其实就是重写的抽象方法的方法体)
2.lambda的使用
总结:
->左边: Lambda形参列表的参数类型可以省略(类型推断);如果Lambda形参列表只有一个参数,则小括号也可省略
->右边: Lambda体应该使用一对{}包裹;如果Lambda体只有一条执行语句(可能是return语句),可{}可以省略,若语句是return,则return必须也要省略
二、方法引用
方法引用的使用
1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的实例。
3.使用格式:类(或对象)::方法名
4.具体分为如下的三种情况:
情况1、对象::非静态方法
情况2、类::静态方法
情况3、类::非静态方法
5.方法引用使用的要求:要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的
形参列表和返回值类型相同!(针对于情况1和情况2>
构造器引用与数组引用
一、构造器引用
和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一抽象方法的返回值类型即为构造器所属的类的类型
二、数组引用
大家可以把数组看做是一个特殊的类,则写法与构造器引用一致。|
三、StreamAPI
1.
Stream关注的是对数据的运算,与CPU打交道
集合关注的是数据的存储,与内存打交道
2.
(1)Stream自己不会存储元素。
(2)Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream.
(3)Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行
3.Stream执行流程
(1)Stream的实例化
(2)—系列的中间操作(过滤、映射、...)
(3)终止操作
4.说明:
4.1一个中间操作链,对数据源的数据进行处理
4.2一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用
Stream中间操作:
映射:
1. map(Function f)-接收一个函数作为参数,将元素转换成其他形式或提取信息,该函数会被应用到每个元素上,并将其映射成一个新的元素
List<string> list = Arrays.asList( "aa", "bb", "cc", "dd" );
list.stream( ).map(str -> str.toUpperCase()).forEach(System.out::println);
2.fLatMap(Function f)—接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连成一个流
Stream<Stream<Character>>streamStream=list.stream().map(StreamAPITest1::fromStrToStream)
streamStream.forEach(s ->s.forEach(system.out: : println);});
-------------------------------------------------------------------------------------------------------------------------------
Stream<Character>characterstream=list.stream().flatMap(StreamAPITest1::fromStrToStream)
characterStream.forEach(System.out: :print1n);
3.sorted()
1自然排序
List<Integer>list=Arrays.asList(1,2,4,3,6,5,34,8,7,0,-9,8,7);
list.stream().sorted().forEach(System.out : : println);
2.sorted( comparator com)—定制排序
List<Employee> employees = EmployeeData.getEmployees();
employees.stream( ).sorted( (e1,e2) ->intageValue=Integer.compare(e1.getAge(),e2.getAge( ));
if(ageValue !=0 {returnageValue;}else{returnDouble.compare(e1.getSalary(),e2.getSalary());
}).forEach(System.out : : println);
Stream终止操作:
检查是否匹配所有元素 allMatch(Predicate p)
检查是否至少匹配一个元素 anyMatch(Predicate p)
检查是否没有匹配所有元素 noneMatch(Predicate p)
返回第一个元素 findFirst()
返回当前流中的任意元素 findAny()
返回流中元素总数 count()
返回流中最大值 max(Comparator c)
返回流中最小值 min(Comparator c)
内部迭代 (使用Collection接口需要用户去做迭代,forEach(Consumer c)称为外部迭代。相反,Stream API使用内部迭代——它帮你把迭代做了)
collect(Collector c) 将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
Optional:
optional类:为了在程序中避免出l现空指针异常而创建的。常用的方法: ofNullable(T t)
orElse(T t)