在Java 8中,引入了Lambda表达式,使得我们可以更加简洁地编写函数式代码。然而,有时候我们可能会发现Lambda表达式还是有一些冗余的地方。为了进一步简化代码,JDK 1.8引入了方法引用,它可以更便捷地代替Lambda表达式。
方法引用的概念
方法引用是对已经存在的方法的一个引用。我们可以将方法引用看作是一个函数指针,它指向了一个已经存在的方法。通过方法引用,我们可以直接引用已经存在的方法,而不需要编写冗余的Lambda表达式。
方法引用的分类
方法引用主要分为四种类型:
- 静态方法引用:引用静态方法,通过类名::方法名的格式表示。例如:
Integer::valueOf
表示引用Integer类的静态方法valueOf。 - 实例方法引用:引用某个实例对象的方法,通过实例对象::方法名的格式表示。例如:
System.out::println
表示引用System.out的println方法。 - 对象方法引用:引用某个类型的方法,通过类名::方法名的格式表示。例如:
String::length
表示引用String类的length方法。 - 构造方法引用:引用某个类的构造方法,通过类名::new的格式表示。例如:
ArrayList::new
表示引用ArrayList类的构造方法。
示例
下面通过几个示例来演示方法引用的使用。
示例1:静态方法引用
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Integer> parseInt = Integer::parseInt;
int result = parseInt.apply("123");
System.out.println(result); // 输出结果:123
}
}
在上面的示例中,我们使用了Integer类的静态方法parseInt,并将其引用给Function接口的apply方法。通过方法引用,我们可以直接使用Integer类的静态方法,而不需要编写冗余的Lambda表达式。
示例2:实例方法引用
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> printUpperCase = System.out::println;
printUpperCase.accept("hello"); // 输出结果:HELLO
}
}
在上面的示例中,我们使用了System.out对象的println方法,并将其引用给Consumer接口的accept方法。通过方法引用,我们可以直接使用实例对象的方法,而不需要编写冗余的Lambda表达式。
示例3:对象方法引用
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Integer> getLength = String::length;
int length = getLength.apply("hello");
System.out.println(length); // 输出结果:5
}
}
在上面的示例中,我们使用了String类的length方法,并将其引用给Function接口的apply方法。通过方法引用,我们可以直接使用类型的方法,而不需要编写冗余的Lambda表达式。
示例4:构造方法引用
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<StringBuilder> createStringBuilder = StringBuilder::new;
StringBuilder sb = createStringBuilder.get();
sb.append("Hello");
System.out.println(sb.toString()); // 输出结果:Hello
}
}
在上面的示例中,我们使用了StringBuilder类的构造方法,并将其引用给Supplier接口的get方法。通过方法引用,我们可以直接使用构造方法,而不需要编写冗余的Lambda表达式。
总结
方法引用是JDK 1.8中的一项重要特性,它可以简化Lambda表达式,使得我们可以更加简洁地编写函数式代码。通过四种不同类型的方法引用,我们可以直接引用已经存在的方法,而不需要编写冗余的Lambda表达式。方法引用在编写函数式代码时非常有用,可以提高代码的可读性和简洁性。因此,在使用Lambda表达式时,我们应该充分利用方法引用来简化代码。
本文来自极简博客,作者:风吹过的夏天,转载请注明原文链接:JDK 1.8中的方法引用:简化Lambda表达式