个性化阅读
专注于IT技术分析

Java方法引用

本文概述

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

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

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
赞(0)
未经允许不得转载:srcmini » Java方法引用

评论 抢沙发

评论前必须登录!