目录
一:什么是::?
二:方法引用的几种类型
1.引用静态方法
2.引用特定对象的实例方法
3.引用特定类型的任意对象的实例方法
4.引用构造方法
三:方法引用的适用场景
四:总结
一:什么是::?
在JDK1.8中引入了Lambda表达式,因此也在JDK1.8引入了::。双冒号 :
:
是方法引用(Method Reference)的一种语法。方法引用是一种更简洁和更易读的方式来表示一个函数式接口的实现,它可以看作是lambda表达式的简写。
二:方法引用的几种类型
1.引用静态方法
import java.util.function.Function;
/**
* @author: dlwlrma
* @data 2024年06月30日 20:00
* @Description: TODO: 测试静态方法引用
*/
public class TestStaticMethod {
public static void main(String[] args) {
Function<String, Integer> function = Integer::parseInt;
Integer apply = function.apply("18");
System.out.println("apply = " + apply);//apply = 18
}
}
以上代码等同于以下代码:
/**
* @author: dlwlrma
* @data 2024年06月30日 20:00
* @Description: TODO: 测试静态方法引用
*/
public class TestStaticMethod {
public static void main(String[] args) {
Function<String, Integer> parseInt = s -> Integer.parseInt(s);
Integer apply1 = parseInt.apply("18");
System.out.println("apply1 = " + apply1);
}
}
底层源码如下:
2.引用特定对象的实例方法
import java.util.function.Supplier;
/**
* @author: dlwlrma
* @data 2024年06月30日 20:25
* @Description: TODO: 测试使用实例对象和方法名引用该对象的实例方法。
*/
public class TestIntanceMethod {
public static void main(String[] args) {
String str = "你好";
Supplier<Integer> runnable = str::length;
Integer i = runnable.get();
System.out.println("i = " + i);//i=2;
}
}
以上代码等同于以下代码 :
import java.util.function.Supplier;
/**
* @author: dlwlrma
* @data 2024年06月30日 20:25
* @Description: TODO: 测试使用实例对象和方法名引用该对象的实例方法。
*/
public class TestIntanceMethod {
public static void main(String[] args) {
String str = "你好";
Supplier<Integer> runnable1 = () -> str.length();
Integer i = runnable1.get();
System.out.println("i = " + i);
// Supplier<Integer> runnable1 = () -> str.length();
}
}
3.引用特定类型的任意对象的实例方法
import java.util.function.Function;
/**
* @author: dlwlrma
* @data 2024年06月30日 20:35
* @Description: TODO: 使用类名和方法名引用该类的实例方法,适用于任意对象。
*/
public class TestIntanceMethod2 {
public static void main(String[] args) {
Function<String, Integer> str = String::length;
Integer length = str.apply("Hello Java");
System.out.println(length);//10
}
}
以上代码等同于以下代码
import java.util.function.Function;
/**
* @author: dlwlrma
* @data 2024年06月30日 20:35
* @Description: TODO: 使用类名和方法名引用该类的实例方法,适用于任意对象。
*/
public class TestIntanceMethod2 {
public static void main(String[] args) {
Function<String, Integer> str1 = s -> s.length();
Integer length = str1.apply("Hello Java");
System.out.println(length);//10
}
}
4.引用构造方法
import java.util.function.Supplier;
/**
* @author: dlwlrma
* @data 2024年06月30日 20:40
* @Description: TODO:使用类名和 new 关键字引用构造方法。
*/
public class TestConstructorMethod {
public static void main(String[] args) {
Supplier<StringBuilder> stringBuilderSupplier = StringBuilder::new;
StringBuilder stringBuilder = stringBuilderSupplier.get();
System.out.println(stringBuilder); // 输出空的 StringBuilder 对象
}
}
以上代码等同于以下代码
import java.util.function.Supplier;
/**
* @author: dlwlrma
* @data 2024年06月30日 20:40
* @Description: TODO:使用类名和 new 关键字引用构造方法。
*/
public class TestConstructorMethod {
public static void main(String[] args) {
Supplier<StringBuilder> stringBuilderSupplier1 = () -> new StringBuilder();
StringBuilder stringBuilder1 = stringBuilderSupplier.get();
System.out.println(stringBuilder);
}
}
三:方法引用的适用场景
方法引用可以用来简化lambda表达式,使代码更简洁易读。它在需要实现函数式接口时特别有用,例如在使用java.util.function包中的接口时。
import java.util.Arrays;
import java.util.List;
/**
* @author: dlwlrma
* @data 2024年06月30日 20:44
* @Description: TODO: 方法引用的实现场景
*/
public class TestDemo {
public static void main(String[] args) {
List<String> names = Arrays.asList("张三", "李四", "王五");
// 使用 lambda 表达式
names.forEach(name -> System.out.println(name));
// 使用方法引用
names.forEach(System.out::println);
}
}
在这个示例中,System.out::println是对System.out对象的println方法的引用,它替代了name -> System.out.println(name)的lambda表达式,使代码更加简洁。
四:总结
在Java中,双冒号(::)可以用作方法引用和构造函数引用的符号。它的好处包括:
1. 简化代码:使用双冒号可以将一些重复的代码进行简化。通过引用已存在的方法或构造函数,可以避免重复编写相同的代码逻辑。
2. 代码可读性更高:通过使用双冒号,可以更清晰地表示代码的意图。它能够更直观地表达方法引用或构造函数引用的含义,使代码更易于理解和维护。
3. 提高代码的可复用性:通过方法引用或构造函数引用,可以将方法或构造函数作为参数传递给其他方法,使代码更加灵活和可复用。
4. 支持函数式编程风格:双冒号操作符在使用Lambda表达式时非常有用。它可以帮助我们将方法引用或构造函数引用与函数式接口一起使用,从而实现函数式编程的目标。
总结来说,双冒号操作符在Java中有助于简化代码、提高可读性、提高代码的可复用性,以及支持函数式编程风格。