Java8新特性
主要就是新增了Lambda表达式和StreamAPI这两个东西
Lambda表达式的使用
1.举例:(o1,o2) -> Integer.compare(o1,o2);
2.格式:
-> : lambda操作符
->左边:lambda形参列表(其实就是接口中的抽象方法的形参列表)
->右边:lambda体(其实就是重写的抽象方法的方法体)
3.Lambda表达式的使用:
4.Lambda表达式的本质:作为函数式接口的实例
5.如果一个接口中,只声明了一个抽象方法,则此接口就成为函数式接口
6.所以以前用匿名实现类表示的现在都可以用Lambda表达式来写
举例:
public void test1() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("没用Lambda"); } }; runnable.run(); System.out.println("------------"); Runnable runnable2 = () -> { System.out.println("用了Lambda"); }; runnable2.run(); }
总结:
->左边:Lambda新茶列表的参数类型可以省略;如果Lambda形参列表只有一个那么()也可以省略
->右边:Lambda体应该用一对{}包裹;如果Lambda体只有一条执行语句,可以省略return或{}
当需要对一个函数式接口实例化的时候,可以使用Lambda表达式;
如果我们开发中需要定义一个函数式接口,首先看看在已有的jdk提供的函数式接口是否有能满足需求的函数式接口。如果有,则直接调用即可
相关面试题
说说Lamda表达式的优缺点
嗯...就我个人的理解的话,Lambda表达式的缺点还是挺多的,第一点就是不容易读懂,一起开发的时候没了解过Lambda的程序员需要花时间去学习,开发的时间成本就增加了;第二就是相对于匿名函数,Lambda调试起来困难一些,这个我感觉到还好;第三就是Lambda在串行处理的时候效率比for低,要在并行处理才能体现出Lambda的优势。
方法引用
1.使用情景:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用
2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例,所以
方法引用也是函数式接口的实例
3.使用格式: 类(或对象) :: 方法名
4.具体分为如下三种情况:
对象 :: 非静态方法
类 :: 静态方法
类 :: 非静态方法
5.方法引用使用的要求:接口中的抽象方法的形参列表和返回值类型与方法引用的方法的相同
举例:
public void test1(){ Consumer<String> consumer = str -> System.out.println(str); consumer.accept("沈阳"); PrintStream ps = System.out; Consumer<String> con2 = ps :: println; con2.accept("邵阳"); }
Stream API
1.Stream关注的是对数据的运算,与cpu打交道
集合关注的是数据的存储,与内存打交道
2.
Stream不会自己存储元素
Stream不会改变源对象,相反,她们会返回一个持有结果的新的Stream
Stream操作时延迟执行的,这意味着她们会等到需要结果的时候才执行
3.Stream执行流程
1-Stream的实例化
2-一系列中间操作
3-终止操作
4.说明:
4.1一个中间操作链,对数据源的数据进行处理
4.2一旦执行终止操作,就执行中间操作链,并产生结果,之后不会再被使用
Stream创建的三种方式
//创建Stream方式一:通过集合 @Test public void test1() { List<Employee> list = EmployeeData.getEmployees(); //顺序流 Stream<Employee> stream = list.stream(); //并行流 Stream<Employee> parallelStream = list.parallelStream(); } //创建Stream方式二:通过数组 @Test public void test2() { int[] arr = new int[]{1, 2, 3}; IntStream stream = Arrays.stream(arr); } //创建Stream方式三:通过Stream的of() @Test public void test3() { Stream<Integer> stream = Stream.of(1, 2, 3); }
Stream的中间操作
1.筛选与切片
2.映射
3.排序
Stream的终止操作
1.匹配与查找
2.归约
3.收集