当前位置: 首页 > 教程 > Java8 >

Java8 方法引用

精华
小牛编辑
129浏览
2023-03-14

1 Java8 方法引用的介绍

Java提供了一个新功能,称为Java 8中的方法引用。方法引用用于引用功能接口的方法。它是lambda表达式的紧凑和简单形式。每次使用lambda表达式仅引用方法时,都可以将lambda表达式替换为方法引用。在本教程中,我们将详细解释方法参考概念。

2 Java8 方法引用的分类

java中有以下几种类型的方法引用:

  1. 引用静态方法。
  2. 引用实例方法。
  3. 引用构造函数。

3 Java8 方法引用:引用静态方法

您可以引用类中定义的静态方法。以下是描述Java中引用静态方法的过程的语法和示例。

3.1 语法

ContainingClass :: staticMethodName  

3.2 案例1

在以下示例中,我们定义了一个功能接口,并将静态方法引用为其功能方法say()。

/**
 * 小牛知识库网: https://www.xnip.cn
 */
interface Sayable{  
    void say();  
}  
public class MethodReference {  
    public static void saySomething(){  
        System.out.println("Hello, this is static method.");  
    }  
    public static void main(String[] args) {  
        // Referring static method  
        Sayable sayable = MethodReference::saySomething;  
        // Calling interface method  
        sayable.say();  
    }  
}  

输出结果为:

Hello, this is static method.

3.3 案例2

在以下示例中,我们使用预定义的功能接口Runnable引用静态方法。

/**
 * 小牛知识库网: https://www.xnip.cn
 */
public class MethodReference2 {  
    public static void ThreadStatus(){  
        System.out.println("Thread is running...");  
    }  
    public static void main(String[] args) {  
        Thread t2=new Thread(MethodReference2::ThreadStatus);  
        t2.start();       
    }  
} 

输出结果为:

Thread is running...

3.4 案例3

您还可以使用预定义的功能接口来引用方法。在下面的示例中,我们使用BiFunction接口并使用了apply() 方法。

/**
 * 小牛知识库网: https://www.xnip.cn
 */
import java.util.function.BiFunction;  
class Arithmetic{  
public static int add(int a, int b){  
return a+b;  
}  
}  
public class MethodReference3 {  
public static void main(String[] args) {  
BiFunction<Integer, Integer, Integer>adder = Arithmetic::add;  
int result = adder.apply(10, 20);  
System.out.println(result);  
}  
}  

输出结果为:

30

3.5 案例4

您也可以通过引用方法来覆盖静态方法。在下面的示例中,我们定义并重载了三种添加方法。

/**
 * 小牛知识库网: https://www.xnip.cn
 */
import java.util.function.BiFunction;  
class Arithmetic{  
public static int add(int a, int b){  
return a+b;  
}  
public static float add(int a, float b){  
return a+b;  
}  
public static float add(float a, float b){  
return a+b;  
}  
}  
public class MethodReference4 {  
public static void main(String[] args) {  
BiFunction<Integer, Integer, Integer>adder1 = Arithmetic::add;  
BiFunction<Integer, Float, Float>adder2 = Arithmetic::add;  
BiFunction<Float, Float, Float>adder3 = Arithmetic::add;  
int result1 = adder1.apply(10, 20);  
float result2 = adder2.apply(10, 20.0f);  
float result3 = adder3.apply(10.0f, 20.0f);  
System.out.println(result1);  
System.out.println(result2);  
System.out.println(result3);  
}  
}  

输出结果为:

30
30.0
30.0

4 Java8 方法引用:引用实例方法

像静态方法一样,您也可以引用实例方法。在下面的示例中,我们描述了引用实例方法的过程。

4.1 语法

containingObject::instanceMethodName 

4.2 案例1

在以下示例中,我们引用了非静态方法。您可以按类对象和匿名对象引用方法。

/**
 * 小牛知识库网: https://www.xnip.cn
 */
interface Sayable{  
    void say();  
}  
public class InstanceMethodReference {  
    public void saySomething(){  
        System.out.println("Hello, this is non-static method.");  
    }  
    public static void main(String[] args) {  
        InstanceMethodReference methodReference = new InstanceMethodReference(); // Creating object  
        // Referring non-static method using reference  
            Sayable sayable = methodReference::saySomething;  
        // Calling interface method  
            sayable.say();  
            // Referring non-static method using anonymous object  
            Sayable sayable2 = new InstanceMethodReference()::saySomething; // You can use anonymous object also  
            // Calling interface method  
            sayable2.say();  
    }  
} 

输出结果为:

Hello, this is non-static method.
Hello, this is non-static method.

4.3 案例2

在下面的示例中,我们引用实例(非静态)方法。可运行接口仅包含一种抽象方法。因此,我们可以将其用作功能接口。

/**
 * 小牛知识库网: https://www.xnip.cn
 */
public class InstanceMethodReference2 {  
    public void printnMsg(){  
        System.out.println("Hello, this is instance method");  
    }  
    public static void main(String[] args) {  
    Thread t2=new Thread(new InstanceMethodReference2()::printnMsg);  
        t2.start();       
    }  
}  

输出结果为:

Hello, this is instance method

4.4 案例3

在下面的示例中,我们使用BiFunction接口。它是一个预定义的接口,包含一个实用的方法apply() 。在这里,我们将添加方法称为应用方法。

/**
 * 小牛知识库网: https://www.xnip.cn
 */
import java.util.function.BiFunction;  
class Arithmetic{  
public int add(int a, int b){  
return a+b;  
}  
}  
public class InstanceMethodReference3 {  
public static void main(String[] args) {  
BiFunction<Integer, Integer, Integer>adder = new Arithmetic()::add;  
int result = adder.apply(10, 20);  
System.out.println(result);  
}  
}  

输出结果为:

30

5 Java8 方法引用:引用构造方法

您可以使用new关键字引用构造函数。在这里,我们借助功能接口来引用构造函数。

5.1 语法

ClassName::new 

5.2 案例

/**
 * 小牛知识库网: https://www.xnip.cn
 */
interface Messageable{  
    Message getMessage(String msg);  
}  
class Message{  
    Message(String msg){  
        System.out.print(msg);  
    }  
}  
public class ConstructorReference {  
    public static void main(String[] args) {  
        Messageable hello = Message::new;  
        hello.getMessage("Hello");  
    }  
} 

输出结果为:

Hello