朋友问我Java中“::”是什么意思?我汗流浃背了......

朋友问我Java中“::”是什么意思?我汗流浃背了......

一:什么是::? 在JDK1.8中引入了Lambda表达式,因此也在JDK1.8引入了::。双冒号 :: 是方法引用(Method Reference)的一种语法。方法引用是一种更简洁和更易读的方式来表示一个函数式接口的实现,它可以看作是lambda表达式的简写。

二:方法引用的几种类型1.引用静态方法代码语言:javascript复制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 function = Integer::parseInt;

Integer apply = function.apply("18");

System.out.println("apply = " + apply);//apply = 18

}

}以上代码等同于以下代码:

代码语言:javascript复制/**

* @author: dlwlrma

* @data 2024年06月30日 20:00

* @Description: TODO: 测试静态方法引用

*/

public class TestStaticMethod {

public static void main(String[] args) {

Function parseInt = s -> Integer.parseInt(s);

Integer apply1 = parseInt.apply("18");

System.out.println("apply1 = " + apply1);

}

}底层源码如下:

2.引用特定对象的实例方法代码语言:javascript复制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 runnable = str::length;

Integer i = runnable.get();

System.out.println("i = " + i);//i=2;

}

}以上代码等同于以下代码 :

代码语言:javascript复制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 runnable1 = () -> str.length();

Integer i = runnable1.get();

System.out.println("i = " + i);

// Supplier runnable1 = () -> str.length();

}

}3.引用特定类型的任意对象的实例方法代码语言:javascript复制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 str = String::length;

Integer length = str.apply("Hello Java");

System.out.println(length);//10

}

}以上代码等同于以下代码

代码语言:javascript复制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 str1 = s -> s.length();

Integer length = str1.apply("Hello Java");

System.out.println(length);//10

}

}4.引用构造方法代码语言:javascript复制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 stringBuilderSupplier = StringBuilder::new;

StringBuilder stringBuilder = stringBuilderSupplier.get();

System.out.println(stringBuilder); // 输出空的 StringBuilder 对象

}

}以上代码等同于以下代码

代码语言:javascript复制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 stringBuilderSupplier1 = () -> new StringBuilder();

StringBuilder stringBuilder1 = stringBuilderSupplier.get();

System.out.println(stringBuilder);

}

}三:方法引用的适用场景 方法引用可以用来简化lambda表达式,使代码更简洁易读。它在需要实现函数式接口时特别有用,例如在使用java.util.function包中的接口时。

代码语言:javascript复制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 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中有助于简化代码、提高可读性、提高代码的可复用性,以及支持函数式编程风格。

相关推荐

郭艾伦:就这一场比赛的胜利不值得我们去高兴
beat365手机版中文

郭艾伦:就这一场比赛的胜利不值得我们去高兴

📅 08-30 👁️ 7097
汽车之家
beat365手机版中文

汽车之家

📅 10-25 👁️ 4140
夏天喝什么最解渴补水?不是冰镇饮料,不是水,而是这个!
365体育投注网站官网

夏天喝什么最解渴补水?不是冰镇饮料,不是水,而是这个!

📅 06-29 👁️ 6467
QQ软件邀请最多可以邀请多少人视频会话?
365bet备用官网

QQ软件邀请最多可以邀请多少人视频会话?

📅 07-25 👁️ 8572
win11bat文件打不开一闪就没了怎么办【详解】
beat365手机版中文

win11bat文件打不开一闪就没了怎么办【详解】

📅 11-02 👁️ 1023
齡的成語
365bet备用官网

齡的成語

📅 11-29 👁️ 8108