Java8 - lambda方法引用,构造器引用,数组引用

  • landscape
    Java8的lambda引入了三种方法引用,构造器引用,及数组引用,以减少代码的开发。需要注意的是,如果需要使用此特性,必须方法返回值类型、参数数量与类型与函数式接口保持一致。

  • 实例
  1. 对象 - 实例方法使用场景
    当对象的实例方法已经实现了函数式接口将要实现的功能,且实例方法的参数数量、参数类型、返回类型与函数式接口一致时,可以使用此特性。使用方式为:
    对象::方法名
/**
 * @author: zhuocc2
 * @date: 2019-09-02 4:53:18 PM
 * @Package: lambda
 * @Description: 对象 - 实例方法 使用场景。
 *  当已经实例的方法已经实现了lambda将要实现的功能,可以使用此方式。
 *  但需要lambda函数式接口的参数与返回值与实例方法的参数与返回值相同
 *  使用方式 对象::方法名
 */
@Test
public void objectInstance() {
    PrintStream sysOut = System.out;
        
    Consumer<String> consumer = sysOut::println;
    consumer.accept("对象-实例方法运用");
}

输出
对象-实例方法运用


  1. 类 - 静态方法使用场景
    当类的静态方法已经实现了函数式接口将要实现的功能,且实例方法的参数数量 、参数类型、返回类型与函数式接口一致时,可以使用此特性。使用方式为:
    类::方法名
/**
 * @author: zhuocc2
 * @date: 2019-09-02 5:27:39 PM
 * @Package: lambda
 * @Description: TODO 类 - 静态方法 使用场景
 *  当类里已经实现了lambda将要实现的功能,可以使用此方式。只需参数与返回与lambda函数式接口保持一致即可。
 *  使用方式 类名::方法名
 */
@Test
public void classStaticMethod() {
    Comparator<Integer> comparator = Integer::compare;
    System.out.println(comparator.compare(2, 1));
}

输出
1


  1. 类 - 实例方法使用场景
    当实例方法的第一个参数为实例方法的调用者,第二个参数为实例方法的参数时,且实例方法的参数数量与类型、返回值类型与函数式接口一致时,可以使用此特性。使用方式为:
    类::方法名
@Test
public void classInstance() {
    BiPredicate<String, String> bp = String::equals;
        
    boolean test = bp.test("2", "2");
    System.out.println(test);
}

输出
true


  1. 构造器引用使用场景
    当构造器的参数列表与函数式接口的参数列表一致时,可以使用此特性。使用方式为:
public class TestConstruct {

    private String str = null;
    
    public TestConstruct(String str) {
        this.str = str;
        System.out.println(str);
    }
    
    public TestConstruct(String str1, String str2) {
        System.out.println(str1 + str2);
    }
    
    public String getStr() {
        return this.str;
    }
}
/**
 * @author: zhuocc2
 * @date: 2019-09-03 9:24:04 PM
 * @Package: lambda
 * @Description: TODO 构造器引用
 */
@Test
public void constructReference() {
    Function<String, TestConstruct> fun = TestConstruct::new;
    TestConstruct construct = fun.apply("str");
    System.out.println(construct.getStr());
}

输出

str
str

  1. 数组引用
/**
 * @author: zhuocc2
 * @date: 2019-09-03 9:30:22 PM
 * @Package: lambda
 * @Description: TODO 数组引用
 */
@Test
public void arrayReference() {
        
    Function<Integer, Float[]> fun = Float[]::new;
    Float[] array = fun.apply(20);
    System.out.println(array.length);   
}

输出
20

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容