Java8 - `Method reference` 参考教程与实例

462 阅读2分钟

Java8 - Method Reference Example

在本教程中,介绍了关于学习java8版本中的方法引用 。

什么是java8中的方法引用?

Method reference 方法引用允许开发者通过它们的名字来调用一个方法或构造函数。

它是编写lambda表达式的另一种简短方式。它使用符号:: ,将类/对象/构造函数与方法名称分开。

有时,我们会收到 "此表达式的目标类型必须是一个功能接口"这样的编译时警告,所以这个错误是因为需要将方法引用或lambda表达式分配给一个功能接口。

这里有一个method reference syntax

Classname:: methodname  
Instancename:: methodname  
Constructorname::new  

介绍了各种类型的方法引用:

  • 静态方法引用
  • 实例方法引用
  • 构造函数引用

静态方法引用实例 java8

静态方法是全局性的,它们可以直接使用java8的Classname.staticmethod()来调用,例如,你可以使用Classname::static-method来调用。

public class MethodReferenceExample {

    public static void main(String[] args) {
        // Using lambda expression  
        BooleanTest lambdaExample = (n) -> PositiveNumberCheck.isPositive(n);
        System.out.println(lambdaExample.test(2));
        System.out.println(lambdaExample.test(-2));

        // Using method reference  
        BooleanTest methodRefExample = PositiveNumberCheck::isPositive;
        System.out.println(methodRefExample.test(2));
        System.out.println(methodRefExample.test(-2));
    }
}

@FunctionalInterface
interface BooleanTest {
    boolean test(int n);
}
class PositiveNumberCheck {
    public static boolean isPositive(int n) {
        return n >= 0;
    }
}  

上述代码的执行结果:

true  
false  
true  
false 

java8中实例方法的引用实例

实例方法对一个类的实例起作用。在java8之前,我们经常使用java8的new class().method name来调用实例方法。例如,你可以调用object:: instance-method

import java.util.function.Function;
public class MethodReferenceExample {
    public Integer IncrementByOne(Integer value) {
        return value + 1;
    }
    public static void main(String[] args) {
        Function function = new MethodReferenceExample()::IncrementByOne;
        System.out.println(function.apply(5));
    }
}  

输出:

6  

java8结构参考示例

Construction reference 可以使用new操作符来调用。

对构造的引用是通过功能接口执行的。下面是一个构造引用的例子

import java.util.function.Consumer;
public class MethodReferenceExample {

    public static void main(String[] args) {
        Consumer function = Emp::new;
        function.accept("Hello");
    }
}
class Emp {
    Emp(String msg) {
        System.out.print(msg);
    }
}  

输出:

Hello  

结论

学习了带有静态构造器和实例语法的方法引用的例子