Java8 新特性
Java8 速度更快,代码更少,强大的Stream API,便于并行 最大化减少空指针异常 optional
Lambda表达式
Lambda 是一个匿名函数,我们可以把Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java的语言表达能力得到了提升。
从匿名类到Lambda 的转换
1// 匿名内部类
2Runnable r1 = new Runnable(){
3 @Override
4 public void run(){
5 System.out.println("Hello world");
6 }
7}
8
9//Lambda 表达式
10Runnable r1 = () -> System.out.println();
11
12//原来使用匿名内部类作为参数传递
13TreeSet<String> ts = new TreeSet<>(new Comparator<String>(){
14 @Override
15 public int compare(String o1, String o2){
16 return Integer.compare(o1.length(), o2.length());
17 }
18});
19
20//Lambda 表达式作为参数传递
21TreeSet<String> ts2 = new TreeSet<>(
22 (o1, o2) -> Integer.compare(o1.length, o2.length));
23
Lambda表达式语法
Lambda表达式在Java语言中引入了一个新的语法元素和操作符。这个操作符为“->”,这个操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:
左侧:指定了Lambda 表达式需要的所有参数
右侧:指定了Lambda体,即Lambda表达式要执行的功能
语法格式
- 无参,无返回值,Lambda 体只需一条语句
1Runnable r1= ()->System.out.println("Hello World");
-
Lambda 需要一个参数
1Consumer<String> fun = (args)-> System.out.println(args);
-
Lambda 只需一个参数时,参数的小括号可以省略
1Consumer<String> fun = args -> System.out.printlna(args);
-
Lambda 需要两个参数,并且有返回值
1BinaryOperator<Long> bo = (x,y) -> { 2 System.out.println("实现函数接口方法!"); 3 return x+y; 4}
-
当Lambda体只有一条语句时,return与大括号可以省略
1BinaryOperator<Long> bo = (x,y)-> x+y;
-
参数的数据类型可以省略,因为可以由编译器推断得出,称为“类型判断”
1BinaryOperator<Long> bo = (Long x, Long y) -> { 2 System.out.println("实现函数接口方法!"); 3 return x+y; 4}
类型推断
上述 Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断”
函数式接口
什么是是函数式接口
- 只包含一个抽象方法的接口,称为函数式接口。
- 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。
- 我们可以在任意函数式接口上使用 @FunctionalInterface 注解, 这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
自定义函数式接口
1@FunctionalInterface
2public interface MyNumber{
3 public double getValue();
4}
函数式接口中使用泛型
1@FunctionalInterface
2public interface MyFunc<T>{
3 public T getValue(T t);
4}
函数式接口作为参数传递给Lambda表达式
1public String toUpperString(Myfunc<String> mf, String str){
2 return mf.getValue(str);
3}
4
5// 作为参数传递Lambda 表达式
6String newStr = toUpperString(
7 (str) -> str.toUpperCase, "abcdef";
8);
9Systen.out.println(newStr);
作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递,接收Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口 的类型。
方法引用与构造器引用
Stream API
接口中默认方法与静态方法
jie
新日期时间 API
其他新特性
Optional类
Optional
常用方法:
Optional.of(T t)
: 创建一个 Optional 实例
Optional.empty(
: 创建一个空的 Optional 实例
Optional.ofNullable(T t)
:若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent()
: 判断是否包含值
orElse(T t)
: 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s)
:如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f)
: 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper)
与 map 类似,要求返回值必须是Optional
重复注解与类型注解
两点改进: 可重复的注解及可用于类型的注解
1@Target({TYPE, FIELD, METHOD, PARAMETER, CON})