Lambdas

一个函数式接口很是有价值的属性就是他们可以用lambdas来实例化。这里有一些lambdas的例子:html

左边是指定类型的逗号分割的输入列表,右边是带有return的代码块:java

1 (int x, int y) -> { return x + y; }

左边是推导类型的逗号分割的输入列表,右边是返回值:函数

1 (x, y) -> x + y

左边是推导类型的单一参数,右边是一个返回值:spa

1 x -> x * x

左边没有输入 (官方名称: "burger arrow"),在右边返回一个值:.net

1 () -> x

左边是推导类型的单一参数,右边是没返回值的代码块(返回void):翻译

1 x -> { System.out.println(x); }

静态方法引用:code

1 String::valueOf

非静态方法引用:htm

1 Object::toString

继承的函数引用:继承

1 x::toString

构造函数引用:接口

1 ArrayList::new

你能够想出一些函数引用格式做为其余lambda格式的简写。

excepiton            
excepiton
翻译于 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只能抛出受检查异常。

相关文章
相关标签/搜索