在正式了解Lambda表达式之前我们先谈谈函数式接口
简单来说,函数式接口是只包含一个方法的接口。
比如Java标准库中的java.lang.Runnable和 java.util.Comparator都是典型的函数式接口。
java 8提供 @FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断, 但 最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。
Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现.
先用Comparator接口写个例子
打开Comparator接口的源码可以看到如下内容, 这是一个函数式接口
@FunctionalInterface
public interface Comparator<T> {
….
}
然后我们通过Lambda表达式给它添加一个实现
Comparator<String> comarator = (first,second) -> Integer.compare(first.length(), second.length());
实际上就是给Comparator接口的唯一方法 boolean equals(Object obj); 添加了行为方式
如果你仔细看,这个接口中其实还有一些 default 方法
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
简单地说,就是Java接口现在可以有非抽象方法了, 个人认为这样好像破坏了java原本的一致性
import java.util.Comparator;
public class Com {
public static void main(String[] args) {
Comparator<String> comarator = (first,second) -> Integer.compare(first.length(), second.length());
String test1 = “abc”;
String test2 = “abc2”;
System.out.println(comarator.compare(test1, test2));
System.out.println(comarator.compare(test2, test1));
}
}
下面是一个用Lambda调用多线程的例子
Runnable runnable = () -> System.out.println(“hello world”);
new Thread(runnable).start();