Lambdas了解
功能接口的一个极其宝贵的特性是可以使用lambdas实例化它们。以下是一些关于lambdas的例子:
以逗号分隔的输入列表,左边是指定类型的输入,右边是返回的块: (int x,int y)-> {return x + y;}
以逗号分隔的输入列表,左侧为推断类型,右侧为返回值: (x,y)- > x + y
左侧为推断类型的单参数,右侧为返回值: x -> x * x
左边没有输入(正式名称:“burger arrow”),右侧返回值: ()- > x
在左边有推断类型的单参数,在右边没有返回(空返回)的块: x - > { System.out.println(x);}
静态方法参考: String::valueOf
非静态方法参考: Object::toString
捕捉方法参考: x::toString
构造函数参考: ArrayList::new
你可以把方法参考表格看作是其他形式的缩写。
方法参考等价的表达式
字符串:返回对象的值x - > String.valueOf(x)
对象::x - > x.toString tostring()
x:tostring()- > x.toString()
ArrayList::new()- > new ArrayList <>()
当然,Java中的方法可以重载。类可以有多个具有相同名称但不同参数的方法。它的构造函数也一样。ArrayList::new可以引用它的三个构造函数中的任何一个。它解决的方法取决于它所使用的功能接口。
以下是两种不能使用错误的例子:
例1:
int count = 0;
List<String> strings = Arrays.asList("a", "b", "c");
strings.forEach(s -> {
count++; // 错误:不能修改count的值
});
例2:
void appendAll(Iterable<String> values, Appendable out)
throws IOException { // doesn‘t help with the error
values.forEach(s -> {
out.append(s); // 错误:不能在这里抛出IOException
// Consumer.accept(T) doesn‘t allow it
});
}
以上是本人对Lambdas的了解性知识,日常遇到的情况可以试着用一下,没有进行深入研究,仅供参考。