3. lambda表达式
Lmabda表达式的语法总结: () -> ();
3.1 左边小括号中参数类型可以省略,编译器会自动匹配。
3.2 左右遇一省括号,即如果只有一个参数,可省去左边小括号;如果lambda方法体中只有一条语句,可省略右边大括号,且如果该语句是返回语句,可省去return。
4. 方法引用
若lambda体中的内容有方法已经实现了,那么可以使用“方法引用”
4.1. 静态方法引用 ClassName::staticMethodName
前提:抽象方法 和 静态方法的方法参数列表 要完全匹配
4.2. 特定实例对象的方法引用 instanceReference::methodName
前提:抽象方法 和 实例方法 的方法参数列表 要完全匹配
注意:实例对象还可以是super, this
4.3. 同类型的任意对象的实例方法引用 ClassName::methodName
前提:抽象方法的第一个参数 absMethod(A a, B b, C c) a的类型A 必须为 ClassName,因为该形式方法引用,默认第一个参数a为方法methodName的调用者,其余参数b,c为methodName的方法参数。即 A::methodName(B b,C c)
4.4. 构造方法引用 ClassName::new
前提:类ClassName中必须存在某个构造器,其构造参数列表,与函数式接口中参数列表保持一致
注意:对于数组,可以使用 Type[]::new 的方式,其中Type为数组类型,但是该形式方法引用仅当函数式接口中参数有且只有一个int型参数时才可以,该参数会被作为构造的数组的初始长度。
以上一些代码实例可参考https://www.cnblogs.com/MadYanYan/p/9788190.html
4.5. 补充 当lambda体中的方法有泛型时,可以在双冒号:: 之后用<T>指定类型。
public interface MyFunc<T> {
int func(T[] als, T v);
}
public class MyArrayOps {
//统计v在数组中出现的次数
public static <T> int countMatching(T[] array, T v) {
int count = 0;
for (T t : array) {
if (t.equals(v)) count++;
}
return count;
}
}
public class Run {
public static <T> int myOp(MyFunc<T> f, T[] array, T v) {
return f.func(array, v);
}
public static void main(String[] args) {
Integer[] vals = {1, 2, 3, 4, 2, 3, 4, 4, 5};
String[] strs = {"One", "Two", "Three", "Two"};
//不指定MyFunc类型时,可根据后面的参数推断
int count1 = myOp(MyArrayOps::countMatching, vals, 4);
System.out.println("vals contains " + count1 + " 4s");
//要指定类型时,可以在::后面指定,指定完可以限制后面两个参数的类型
int count2 = myOp(MyArrayOps::<String>countMatching, strs, "Two");
System.out.println("strs contains " + count2 + " Twos");
}
}
//本例子参考自:https://www.cnblogs.com/xiaoxi/p/7099667.html