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表达式和匿名内部类 相同:
  1. Lambda表达式作为匿名内部类的简化,可以访问外部类的成员变量。
  2. 对于局部变量有隐式final修饰,不允许重新赋值。
区别:
  1. 匿名内部类可以为任意接口创建实例,只需要匿名内部类实现所有抽象方法,Lambda表达式只能为函数式接口创建实例。(@FunctionalInterface注解会检查接口是否为函数式接口)
  2. 匿名内部类可以为抽象类、普通类创建实例,Lambda表达式只能为函数式接口创建实例。
  3. 匿名内部类实现抽象方法的方法体允许调用接口中定义的默认方法,Lambda表达式不允许调用接口定义的默认方法。
jdk8 java.util.function预定义函数式接口
  1. xxxFunction: apply()抽象方法,对参数进行处理、转换,返回新值。
  2. xxxConsumer: accept()抽象方法,对参数处理,不返回结果
  3. xxxPredicate: test()抽象方法,对参数判断,筛滤数据,返回boolean
  4. xxxSupplier: getAsXxx()抽象方法,无参数,返回结果。
【java中Lambda表达式支持的方法引用和构造器引用】eg:
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]

    推荐阅读