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

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

一:什么是::?

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

相关文章
|
消息中间件 存储 SQL
【Java知识点大全】(十一)
【Java知识点大全】
|
消息中间件 存储 Java
【Java知识点大全】(十二)
【Java知识点大全】
|
负载均衡 监控 Java
【Java知识点大全】(十四)
【Java知识点大全】
|
5月前
|
Java
【Java基础面试二十三】、==和equals()有什么区别?
这篇文章区分了Java中的`==`运算符和`equals()`方法:`==`用于基本数据类型时比较值是否相等,用于引用类型时比较内存地址是否相同;而`equals()`默认实现按内存地址比较,但通常被重写以根据对象内容比较是否相等。
【Java基础面试二十三】、==和equals()有什么区别?
|
7月前
|
安全 Java
UUID太长怎么办?快来试试NanoId(Java版本)
UUID太长怎么办?快来试试NanoId(Java版本)
287 5
|
7月前
|
开发框架 Oracle Java
一篇文章讲明白Java简介
一篇文章讲明白Java简介
200 0
|
SQL 安全 Java
JAVA的第一篇文章(Java,干嘛啊,哎呦~)—— JAVA概述和一部分基础语法
JAVA的第一篇文章(Java,干嘛啊,哎呦~)—— JAVA概述和一部分基础语法
|
Java
Com.Java.Basis 第十三课 《Java中的异常处理》经历前面的十二课的学习:我在思考在Java中报错如何处理
Com.Java.Basis 第十三课 《Java中的异常处理》经历前面的十二课的学习:我在思考在Java中报错如何处理
61 0
java202302java学习笔记第十天-带参数的方法的调用3 原创
java202302java学习笔记第十天-带参数的方法的调用3 原创
52 0
java202302java学习笔记第十天-带参数的方法的调用3 原创
1064 朋友数(JAVA)
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。