一个函数式接口非常有价值的属性就是他们能够用lambdas来实例化。这里有一些lambdas的例子: 左边是指定类型的逗号分割的输入列表,右边是带有return的代码块:
左边是推导类型的逗号分割的输入列表,右边是返回值:
左边是推导类型的单一参数,右边是一个返回值:
左边没有输入 (官方名称: ),在右边返回一个值:
左边是推导类型的单一参数,右边是没返回值的代码块(返回void):
静态方法引用:
非静态方法引用:
继承的函数引用:
构造函数引用:
你可以想出一些函数引用格式作为其他lambda格式的简写。 | 翻译于 1年前2人顶 顶 翻译的不错哦! |
方法引用 | 等价的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只能抛出受检查异常。