Java方法引用

本文概述

  • 方法引用的类型
  • 1)引用静态方法
  • 2)引用实例方法
  • 3)引用构造函数
Java在Java 8中提供了一个称为方法引用的新功能。方法引用用于引用功能接口的方法。它是lambda表达式的紧凑易用形式。每次使用lambda表达式仅引用方法时, 都可以将lambda表达式替换为方法引用。在本教程中, 我们将详细解释方法参考概念。
方法引用的类型 java中有以下几种类型的方法引用:
  1. 引用静态方法。
  2. 引用实例方法。
  3. 引用构造函数。
Java方法引用

文章图片
1)引用静态方法 你可以引用类中定义的静态方法。以下是描述Java中引用静态方法的过程的语法和示例。
句法
ContainingClass::staticMethodName

例子1
在以下示例中, 我们定义了一个函数接口, 并将静态方法引用为其函数方法say()。
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.

例子2
在下面的示例中, 我们使用预定义的功能接口Runnable引用静态方法。
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
你还可以使用预定义的功能接口来引用方法。在下面的示例中, 我们使用BiFunction接口并使用了apply()方法。
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

例子4
你也可以通过引用方法来覆盖静态方法。在下面的示例中, 我们定义并重载了三种添加方法。
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

2)引用实例方法 像静态方法一样, 你也可以引用实例方法。在下面的示例中, 我们描述了引用实例方法的过程。
句法
containingObject::instanceMethodName

例子1
在以下示例中, 我们引用了非静态方法。你可以按类对象和匿名对象引用方法。
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.

例子2
【Java方法引用】在下面的示例中, 我们引用实例(非静态)方法。可运行接口仅包含一种抽象方法。因此, 我们可以将其用作功能接口。
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

例子3
在下面的示例中, 我们使用BiFunction接口。它是一个预定义的接口, 包含一个功能方法apply()。在这里, 我们将添加方法称为应用方法。
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

3)引用构造函数 你可以使用new关键字引用构造函数。在这里, 我们借助功能接口来引用构造函数。
句法
ClassName::new


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

    推荐阅读