java8新特性
1.简介
-
为什么使用java8新特性?
- 速度更快
- 代码更少(增加了新的语法lambda表达式)
- 强大的Stream API
- 便于并行
- 最大化减少空指针异常Optional
- Nashom引擎,允许在JVM上运行JS应用
-
java8是oracle公司于2014年3月发布,可以看成是自java5以来最具革命性的版本。java8为 java语言、编译器、类库、开发工具与JVM带来了大量新特性
2.lambda表达式
Lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码(代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使java的语言表达能力得到了提示。
-
举例:(o1,o2)->{Integer.compare(o1,o2)}
-
格式:
->右边:lambda操作符或箭头操作符
->左边:lambda形参列表
->{ 重写方法的方法体 }
3.lambda表达式的六种使用方式
//第一种无参无返 LambdaInterface01 lambdaInterface01 = () -> { System.out.println("lambda第一种形式,无参无返形式"); }; //通过lambda接口实例调用方法 lambdaInterface01.LambdaInfo(); System.out.println("------------------------------"); //第二种有参无返 LambdaInterface02 lambdaInterface02 = (String param) -> { System.out.println("lambda第二种形式,有参无返使用,参数是:" + param); }; lambdaInterface02.LambdaInfo("周高帆"); System.out.println("------------------------------"); /*第三种,参数类型可以省略,参数名可以重新定义,因为可以通过编译器推断得出 称为“类型推断” */ LambdaInterface03 lambdaInterface03=(param1, param2)->{ System.out.println("lambda第三种形式,类型推断,参数1:"+param1+",参数2:"+param2); }; lambdaInterface03.LambdaInfo("我是参数1",2); System.out.println("------------------------------"); //第四种:参数为一个时,()可以省略,例如:param->{内容} LambdaInterface04 lambdaInterface04=param -> { System.out.println("lambda第四种形式,参数为单个时可以省略():"+param); }; lambdaInterface04.LambdaInfo("我是第四种形式"); System.out.println("------------------------------"); //lambda第五种形式,lambda返回值 LambdaInterface05 lambdaInterface05=(param1, param2) -> { System.out.println("Lambda第五种形式,带有返回值"); return param1+param2; }; String result1=lambdaInterface05.LambdaInfo("Hello","Word"); System.out.println("------------------------------"); //lambda第六种形式,方法体内只有一条代码的话,{}和return都可以省略 LambdaInterface06 lambdaInterface06=() ->"我是第六种形式"; String result2=lambdaInterface06.LambdaInfo();
4.lambda的本质:作为函数式接口的实例
3.函数式接口(Functional)
- 如果一个接口中只声明了一个抽象方法那么这个接口被称为函数式接口。(默认方法和静态方法不包括在内)
- 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式)抛出一个受检查异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法是进行声明)。
- 我们可以在一个接口上使用@Funcational注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。
- 在java.util.function包下定义了java8的丰富的函数式接口
4.Java内置的函数式接口
1.消费型接口Consumer,方法 void accept(T t);
2.供给型接口Supplier,方法 T get();
3.函数型接口Function<T,R>方法 R apply(T t);
4.断定型接口Predicate 方法 boolean test(T t);
5.方法和构造器引用
-
方法引用
- 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
- 方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
- 要求: 实现接口的抽象方法的参数列表和返回值类型必须与方法引用的方法的参数列表和返回值类型保持一致!
- 格式: 使用操作符 ” :: “ 将类(或对象)与方法名分隔开来。
- 对象::实例方法名
- 类::静态方法名
- 类::实例方法名
6.Stream API
Stream到底是什么?
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
“集合讲的是数据,Stream讲的是计算”
注意:
-
Stream自己不会存储元素。
-
Stream不会改变源对象,相反,他们会返回一个持有结果的新Stream。
-
Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行。
java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是Stream API。
- Stream API (java.util.stream)把真正的函数式编程风格引入到java中。这是目前为止对java类库最好的补充,因为Stream API可以极大提供java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
- Stream 是java8中处理集合的关键抽象概率,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简言之,Steam API提供了一种高效且易于使用的处理数据的方式。
Stream 的三个操作步骤
-
创建Stream
- 一个数据源(如:集合、数组),获取一个流
-
中间操作
- 一个中间操作链,对数据源的数据进行处理
-
终止操作(终端操作)
- 一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用。
tream
-
一个数据源(如:集合、数组),获取一个流
-
中间操作
- 一个中间操作链,对数据源的数据进行处理
-
终止操作(终端操作)
- 一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用。