一个函数式接口很是有价值的属性就是他们可以用lambdas来实例化。这里有一些lambdas的例子:html 左边是指定类型的逗号分割的输入列表,右边是带有return的代码块:java
左边是推导类型的逗号分割的输入列表,右边是返回值:函数
左边是推导类型的单一参数,右边是一个返回值:spa
左边没有输入 (官方名称: "burger arrow"),在右边返回一个值:.net
左边是推导类型的单一参数,右边是没返回值的代码块(返回void):翻译
静态方法引用:code
非静态方法引用:htm
继承的函数引用:继承
构造函数引用:接口
你能够想出一些函数引用格式做为其余lambda格式的简写。 |
![]() excepiton |
方法引用 | 等价的lambda表达式 | |
---|---|---|
String::valueOf | x -> String.valueOf(x) | |
Object::toString | x -> x.toString() | |
x::toString | () -> x.toString() | |
ArrayList::new | () -> new ArrayList<>() |
固然,在Java里方法能被重载。类能够有多个同名但不一样参数的方法。这一样对构造方法有效。ArrayList::new可以指向它的3个构造方法中任何一个。决定使用哪一个方法是根据在使用的函数式接口。
一个lambda和给定的函数式接口在“外型”匹配的时候兼容。经过“外型”,我指向输入、输出的类型和声明检查异常。
给出两个具体有效的例子:
1 |
Comparator<String> c = (a, b) -> Integer.compare(a.length(), |
2 |
b.length()); |
一个Comparator<String>的compare方法须要输入两个阐述,而后返回一个int。这和lambda右侧的一致,所以这个任务是有效的。
1 |
Runnable r = () -> { System.out.println( "Running!" ); } |
一个Runnable的run方法不须要参数也不会返回值。这和lambda右侧一致,因此任务有效。
在抽象方法的签名里的受检查异常(若是存在)也很重要。若是函数式接口在它的签名里声明了异常,lambda只能抛出受检查异常。