java中Lambda表达式支持的方法引用和构造器引用
一 引用类方法 示例:类名::类方法
说明:函数式接口中被实现方法的全部参数传给该类方法作为参数
Lambda表达式:(a,b,...) -> 类名.类方法(a,b,...)
/ 类名::类方法
(只有一行调用类方法代码时)
@FunctionalInterface
interface Converter {
Integer convert(String form);
}public class LambdaTest {
public static void main(String[] args) {
//Converter converter1 = Integer::valueOf;
Converter converter1 = form -> Integer.valueOf(form);
Integer val = converter1.convert("99");
System.out.println(val);
}
}//result: 99
二 引用特定对象的实例方法 示例:
特定对象::实例方法
说明:函数式接口中被实现方法的全部参数传给该方法作为参数
Lambda表达式:
(a,b,...) -> 特定对象.实例方法(a,b,...)
/ 特定对象::实例方法
(只有一行时)@FunctionalInterface
interface Converter {
Integer convert(String form);
}public class LambdaTest {
public static void main(String[] args){
//Converter converter2 = "xxx.xxx"::indexOf;
Converter converter2 = form -> "xxx.xxx".indexOf(from);
Integer val = converter2.convert("99");
System.out.println(val);
}
}
三 引用某类对象的实例方法 示例:
类名::实例方法
说明:函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数
Lambda表达式:
(a,b,...) -> a.实例方法(b,...)
/ 类名::实例方法
(一行)@FunctionalInterface
interface Test {
String test(String a, int b, int c);
}public class LambdaTest {
public static void main(String[] args){
//Test t = String::substring;
Test t = (a, b, c) -> a.substring(b, c);
String s = t.test("vincent", 2, 5);
System.out.println(s);
}
}//result: nce
四 引用构造器 示例:
类名::new
说明:函数式接口中被实现方法的全部参数传给该构造器作为参数
Lambda表达式:
(a,b,...) -> new 类名(a,b,...)
/ 类名::new
(一行)@FunctionalInterface
interface Test {
JFrame win(String title);
}public class LambdaTest {
public static void main(String[] args) {
//Test t = JFrame::new;
Test t = (String a) -> new JFrame(a);
JFrame jf = t.win("windows");
System.out.println(jf);
}
}
其他 Lambda表达式和匿名内部类 相同:
- Lambda表达式作为匿名内部类的简化,可以访问外部类的成员变量。
- 对于局部变量有隐式final修饰,不允许重新赋值。
- 匿名内部类可以为任意接口创建实例,只需要匿名内部类实现所有抽象方法,Lambda表达式只能为函数式接口创建实例。(@FunctionalInterface注解会检查接口是否为函数式接口)
- 匿名内部类可以为抽象类、普通类创建实例,Lambda表达式只能为函数式接口创建实例。
- 匿名内部类实现抽象方法的方法体允许调用接口中定义的默认方法,Lambda表达式不允许调用接口定义的默认方法。
- xxxFunction: apply()抽象方法,对参数进行处理、转换,返回新值。
- xxxConsumer: accept()抽象方法,对参数处理,不返回结果
- xxxPredicate: test()抽象方法,对参数判断,筛滤数据,返回boolean
- xxxSupplier: getAsXxx()抽象方法,无参数,返回结果。
import java.util.Arrays;
public class LambdaTest {
public static void main(String[] args) {
String[] arr = new String[]{"java","ios","android"};
Arrays.parallelSort(arr, (o1,o2) -> o1.length() - o2.length());
System.out.println(Arrays.toString(arr));
}
}//result: [ios, java, android]
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募