Java 中的双冒号 (::) 运算符
在 Java 中,双冒号 (::) 运算符(也称为方法引用运算符)是 Java 8 中引入的一项强大功能。它提供了一种简洁而丰富的方法来引用方法或构造函数而无需调用它们。此运算符改进了代码并提高了代码一致性,使其成为开发人员的重要工具。在本文中,我们将探讨双冒号运算符的语言结构,讨论其应用,并提供代码指南以更好地理解。
语法
双冒号运算符由夹在类名或对象引用和方法名之间的两个冒号 (::) 组成。它用作 Java 中引用方法或构造函数的简写符号。
// 具有单个抽象方法的功能接口
interface Printer {
void print(String message);
}
// 实现 Printer 接口的类
class ConsolePrinter {
public static void printMessage(String message) {
System.out.println(message);
}
}
public class Main {
public static void main(String[] args) {
Printer Printer = ConsolePrinter::printMessage;
Printer.print("Hello, World!");
}
}
语法说明
在上面的代码中,我们用一个动态方法 print() 来定义一个名为 Printer 的实用连接点。ConsolePrinter 类执行此连接点并为 printMessage() 方法提供一个执行。在 Principal 类中,我们使用双冒号运算符创建 Printer 实例,以引用 ConsolePrinter 类的 printMessage() 方法。最后,我们在打印机示例中调用 print() 方法,该方法又调用 printMessage() 方法。
算法
要在 Java 中使用双冒号运算符,请按照以下步骤操作 -
使用单个抽象方法定义功能接口。
在类中实现接口并提供方法实现。
使用双冒号运算符引用方法或构造函数。
使用双冒号运算符创建功能接口的实例。
在实例上调用方法,该方法将调用引用的方法或构造函数。
方法 1:使用双冒号运算符的方法引用
方法 1 涉及使用双冒号运算符引用类的静态方法。当我们想要传递不依赖于任何实例变量的方法引用时,这种方法很有用。
示例
// A functional interface with a single abstract method
interface Calculator {
int calculate(int a, int b);
}
class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = MathUtils::add;
int result = calculator.calculate(5, 3);
System.out.println("Result: " + result);
}
}
输出
Result: 8
解释
Calculator 是一个函数式接口,具有一个抽象方法 calculate()。静态 MathUtils 函数 add() 将两个数字相加。双冒号运算符创建一个引用 MathUtils 的 add() 方法的 Calculator 实例。我们用两个数字调用计算器的 compute() 方法。控制台输出结果。
方法 2:使用实例变量使用双冒号运算符进行方法引用
方法 2 涉及使用双冒号运算符引用特定对象的实例方法。
示例
import java.util.ArrayList;
import java.util.List;
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void printName() {
System.out.println(name);
}
}
public class Main {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Alice"));
persons.add(new Person("Bob"));
persons.forEach(Person::printName);
}
}
输出
Alice Bob
解释
在此示例中,我们有一个 Individual 类,该类具有 printName() 方法,用于打印个人姓名。我们创建 Individual 项目的列表并向其中添加两个示例。利用双冒号运算符,我们在 Rundown 接口的 forEach() 方法中引用 Individual 类的 printName() 方法。这会导致为列表中的每个元素调用 printName() 方法,将其名称打印到控制台。
方法 3:使用双冒号运算符引用任何对象的实例方法的方法。
方法 3 涉及使用双冒号运算符引用特定类型的任意对象的实例方法。
示例
import java.util.Arrays;
import java.util.List;
class StringUtil {
public boolean isPalindrome(String s) {
String reversed = new StringBuilder(s).reverse().toString();
return s.equals(reversed);
}
}
public class Main {
public static void main(String[] args) {
List<String> words = Arrays.asList("level", "hello", "radar", "world");
StringUtil stringUtil = new StringUtil();
long count = words.stream().filter(stringUtil::isPalindrome).count();
System.out.println("Number of palindromic words: " + count);
}
}
输出
Number of palindromic words: 2
解释
在此代码片段中,StringUtil 类使用 isPalindrome() 测试回文。我们创建一个单词列表,并使用流对回文单词进行排序,使用双冒号管理员推荐的 isPalindrome() 方法。控制中心显示回文单词数。
方法 4:使用双冒号运算符引用构造函数。
方法 4 涉及使用双冒号运算符引用构造函数。
示例
import java.util.function.Supplier;
class Employee {
public String name;
public int age;
public Employee() {
// Default constructor
}
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Employee [name=" + name + ", age=" + age + "]";
}
}
public class Main {
public static void main(String[] args) {
Supplier employeeSupplier = Employee::new;
Employee employee = employeeSupplier.get();
employee.name = "John Doe";
employee.age = 30;
System.out.println(employee);
}
}
输出
Employee [name=John Doe, age=30]
解释
在此模型中,我们有一个具有定义构造函数的 Agent 类。使用双冒号管理器,我们创建一个引用 Agent 构造函数的 Provider 函数实例。然后,我们在 employeeSupplier 实例上调用 get() 方法以获取另一个 Agent 实例。我们设置员工的姓名和年龄,并使用 toString() 方法将其打印到控制台。
结论
Java 中的双冒号 (::) 管理器是 Java 8 中引入的强大功能。它提供了一种简单而丰富的方法来引用方法或构造函数,而无需直接调用它们。通过使用双冒号管理器,我们可以处理代码,进一步提高可理解性,并影响 Java 中功能编程的优势。了解使用双冒号管理器的语法和其他方法对于每个 Java 开发人员来说都是必不可少的。因此,请尝试在您未来的 Java 项目中研究和使用此功能,以改善您的编码体验。
相关文章
有用资源
java 参考教程 - 该教程包含有关 java 的更多信息:https://www.cainiaomax.com/java/

