Java8新特性:Lambda表达式和函数式接口

Java8新特性:速度更快,代码更少,stream API,便于并行,最大化减少空指针异常:Optional

Lambda表达式

好处

Lambda是一个匿名函数,可以把lambda表达式理解为一段可以传递的代码,写出更简洁,更灵活的代码,使得Java语言表达能力得到提高

Lambda表达式只能为函数式接口的形参,变量赋值(SAM)
public class TestLambda1 {
	public static void main(String[] args) {
		//需要override run()方法
		new Thread(){
			public void run(){
				print();				
			}
		}.start();
		//用thread()启动runnable()
		new Thread(new Runnable() {
			public void run() {
				print();
			}
		}).start();
		
		//匿名函数 lambda表达式,减少了代码量
		new Thread(() -> print()).start();
	}
	private static void print(){
		for(int i=0; i<=9; ++i){
			System.out.println(i);
		}
	}
}

函数式接口

具有SAM特性的接口(Single abstract method):

  1. 使得以这种类型的接口为参数时,可以使用Lambda表达式为参数,底层可以进行解析,不影响功能,减少代码量
  2. 函数式接口必定使用@FunctionalInterface进行修饰
    注解: @FunctionalInterface
    SAM原则的两个意外情况:
  • 抽象类的默认方法和静态方法并不影响函数式接口的契约,可以随意使用
  • 可以有Object重写的方法,toString() hashcode(),equals()方法

Java四大核心函数式接口

名称 函数式 参数类型 返回值 用途
消费型接口 Consumer< T > T void
供给型接口 Supplier< T >
断定型接口 Predicate< T >
函数型接口 Function<T,R>

Lambda基本语法

Java8新特性:Lambda表达式和函数式接口
格式:

  • 无参无返回值:
形式:() ->{Lambda 体}
说明: 如果Lambda体只有一句,那么{ ;}可以省略
  • 无参有返回值:
()->{Lambda体}
说明:如果Lambda体只有一个语句,那么{return;}可以省略
如果{}没有省略,那么return也不可以省略
()不可以省略
  • 有参无返回值:
消费型:
(形参列表)->{Lambda体} 
说明:如果Lambda体只有一个语句,那么{;}可以省略
如果他的形参类型是确定的,或是可以推断的,形参类型可以省略
如果形参列表只有一个,那么形参和()都可以省略		

  • 有参有返回值:
(形参列表)->{Lambda体}
说明:如果Lambda体只有一个语句,{return ; }可以省略
如果形参的类型是确定的,或者是可以推断的,那么形参的类型可以省略
如果他的形参只有一个形参,那么()和数据类型都可以省略
形参名不可以省略,但是形参名可以和接口的抽象方法的形参名不一样
四大类核心的函数式接口:
1.消费型接口:
抽象方法有参数无返回值
Interface Consumer<T>:void accept(T t)
2.供给型:
抽象方法:有返回值无参
Interface Supplier<T>: T get()
3.功能性:
抽象方法:有参有返回值
Interface Function<T,R>
R apply<T t>
4.判断型:
抽象方法:返回值是boolean
Interface Predicate<T>: boolean test(T t)
JDK1.8中的optional

背景 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。
Optional类是一个容器类,代表一个值存在还是不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

常用方法:
  • Optional.of(T t):创建一个optional对象实例,t不能为null
  • Optional.empty():创建一个空的optional实例对象
  • Optional.ofNullable(T t):t可以为null,若不为null创建实例,否则创建optional空实例
  • isPresent()是否包含值
  • T get():如果调用对象包含值,则返回,否则抛出异常
  • orElse(): 有值返回,否则返回指定值
  • orElseGet():与orElse()类似,区别在于得到的默认值,orElseGe()通过Supplier的接口的默认实现生成返回值
  • orElseThrow():如果有值则将其返回,否则抛出supplier接口创建的异常