把已有的方法拿过来用,当作函数式接口中抽象方法的方法体
函数式接口
函数式接口(Functional Interface)是指只包含一个抽象方法的接口。在Java编程语言中,函数式接口是支持函数式编程的关键。函数式编程是一种编程范式,它将计算视为数学函数的求值,并避免改变状态和可变数据。Java 8引入了Lambda表达式和函数式接口,以支持函数式编程的特性。
在函数式接口中,只能有一个抽象方法,但可以有多个默认方法(带有默认实现的方法)或静态方法。这种设计允许在使用Lambda表达式时,将接口实例化为一个函数对象。
函数式接口的定义要求使用**@FunctionalInterface
**注解,这样在编译时能够确保接口只包含一个抽象方法。以下是一个简单的函数式接口示例:
javaCopy code
@FunctionalInterface
interface MyFunctionalInterface {
// 抽象方法
void myAbstractMethod();
// 默认方法
default void myDefaultMethod() {
System.out.println("Default method implementation");
}
// 静态方法
static void myStaticMethod() {
System.out.println("Static method implementation");
}
}
在上述示例中,MyFunctionalInterface
是一个函数式接口,它包含一个抽象方法myAbstractMethod
,以及一个默认方法和一个静态方法。
通过使用Lambda表达式,可以轻松地实例化这样的函数式接口:
javaCopy code
public class Main {
public static void main(String[] args) {
MyFunctionalInterface myFunctionalInterface = () -> {
System.out.println("Lambda expression implementation");
};
myFunctionalInterface.myAbstractMethod();
myFunctionalInterface.myDefaultMethod();
MyFunctionalInterface.myStaticMethod();
}
}
这里,Lambda表达式用于实现函数式接口的抽象方法,从而创建一个可以通过接口引用进行调用的函数对象。
public static void main(String[] args) {
Integer[] arr=new Integer[10];
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return 0;
}
});
public int subtraction(int n1,int n2){
return n2-n1;
}
引用后:
Arrays.sort(arr,new DemoApplication()::subtraction);
格式:类名::静态方法
格式:对象::成员方法
其他类对象::方法名
this::方法名
super::方法名
静态类中没有this,在静态类中引用本类方法就只能通过创建类的对象来引用
格式:数据类型[]::new
格式:类名::成员方法
第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法,第一个参数一般表示这里面的每一个数据。假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法
第二个参数到最后一个参数:跟被引用方法的形参保持一致
通常是优先使用引用成员方法的形式,如果形参不符合,不是完全一致,则考虑使用该方法
静态方法引用形式为 类名::静态方法
,它适用于已经存在的、无需实例化的方法。以下是一个简单的例子:
// 定义一个接口
interface Calculator {
int add(int a, int b);
}
// 定义一个工具类
class MathUtil {
static int staticAdd(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
// 使用静态方法引用
Calculator calculator = MathUtil::staticAdd;
// 调用方法
int result = calculator.add(3, 7);
System.out.println("Result: " + result);
}
}
在这个例子中,Calculator
接口有一个抽象方法 add
,我们使用了静态方法引用 MathUtil::staticAdd
来实现该抽象方法。这使得我们可以通过 calculator.add(3, 7)
调用 MathUtil.staticAdd(3, 7)
。
实例方法引用形式为 实例::实例方法
,它适用于已经存在的、需要实例化的方法。以下是一个示例:
// 定义一个接口
interface Printer {
void print(String message);
}
// 定义一个实例类
class MessagePrinter {
void printMessage(String message) {
System.out.println(message);
}
}
public class Main {
public static void main(String[] args) {
// 使用实例方法引用
MessagePrinter messagePrinter = new MessagePrinter();
Printer printer = messagePrinter::printMessage;
// 调用方法
printer.print("Hello, Method Reference!");
}
}
在这个例子中,Printer
接口有一个抽象方法 print
,我们使用了实例方法引用 messagePrinter::printMessage
来实现该抽象方法。这使得我们可以通过 printer.print("Hello, Method Reference!")
调用 messagePrinter.printMessage("Hello, Method Reference!")
。
特定类的任意对象的方法引用形式为 类名::实例方法
,它适用于已经存在的、需要实例化的方法。以下是一个示例:
// 定义一个接口
interface Greeter {
void greet(String name);
}
// 定义一个实例类
class GreetingService {
private String prefix;
GreetingService(String prefix) {
this.prefix = prefix;
}
void greetPerson(String name) {
System.out.println(prefix + " " + name);
}
}
public class Main {
public static void main(String[] args) {
// 使用特定类的任意对象的方法引用
GreetingService englishGreeting = new GreetingService("Hello");
GreetingService frenchGreeting = new GreetingService("Bonjour");
Greeter englishGreeter = englishGreeting::greetPerson;
Greeter frenchGreeter = frenchGreeting::greetPerson;
// 调用方法
englishGreeter.greet("John");
frenchGreeter.greet("Alice");
}
}
在这个例子中,Greeter
接口有一个抽象方法 greet