首页 > 编程语言 >深入理解Java双冒号(::)运算符的使用

深入理解Java双冒号(::)运算符的使用

时间:2024-03-20 10:34:32浏览次数:19  
标签:冒号 Java String class public 运算符 org import Example

Jdk8中有好多新的特性,比如引入Lambda,简化代码的书写等等

我们先看一个关于Lambda的使用

 

/**
* 输出list
 */
@Test
public void test() {
    String[] array = {"aaaa", "bbbb", "cccc"};
    List<String> list = Arrays.asList(array);
    
    //Java 7 
    for(String s:list){
        System.out.println(s);
    }
    
    //Java 8
    list.forEach(System.out::println);
}

其中list.forEach(System.out::println);就是Java 8中的Lambda写法之一, 有没有特别注意到输出语句跟我们平时写的syso语句不一样

 

双冒号(::)

英文:double colon,双冒号(::)运算符在Java 8中被用作方法引用(method reference),方法引用是与lambda表达式相关的一个重要特性。它提供了一种不执行方法的方法。为此,方法引用需要由兼容的函数接口组成的目标类型上下文。

Method References
You use lambda expressions to create anonymous methods. Sometimes, however, a lambda expression does nothing but call an existing method. In those cases, it’s often clearer to refer to the existing method by name. Method references enable you to do this; they are compact, easy-to-read lambda expressions for methods that already have a name.
关于方法引用的描述,摘自oracle官网

大致意思是,使用lambda表达式会创建匿名方法, 但有时候需要使用一个lambda表达式只调用一个已经存在的方法(不做其它), 所以这才有了方法引用!

以下是Java 8中方法引用的一些语法:

  • 静态方法引用(static method)语法:classname::methodname 例如:Person::getAge
  • 对象的实例方法引用语法:instancename::methodname 例如:System.out::println
  • 对象的超类方法引用语法: super::methodname
  • 类构造器引用语法: classname::new 例如:ArrayList::new
  • 数组构造器引用语法: typename[]::new 例如: String[]:new
  • 如果上的语法太枯燥,那就通过一些例子来加强对它的理解:

下面是一些例子:

 

静态方法语法使用例子:

import java.util.Arrays;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
 * 
 * @author zhoufy
 * @date 2019年2月20日 下午2:19:13
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan("com.zhoufy")
public class Demo {
    @Test
    public void test() {
        List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
        
        //静态方法语法    ClassName::methodName
        list.forEach(Demo::print);
    }
    
    public static void print(String content){
        System.out.println(content);
    }
}

 

 

类实例方法语法使用例子:

import java.util.Arrays;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
 * 
 * @author zhoufy
 * @date 2019年2月20日 下午2:19:13
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan("com.zhoufy")
public class Demo {
    @Test
    public void test() {
        List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
        
        //对象实例语法    instanceRef::methodName
        list.forEach(new Demo()::print);
    }
    
    public void print(String content){
        System.out.println(content);
    }
}

超类方法语法使用例子:

import java.util.Arrays;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


/**
 * @author zhoufy
 * @date 2019年2月20日 下午2:41:38
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan("com.zhoufy")
public class Example extends BaseExample{

    @Test
    public void test() {
        List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
        
        //对象的超类方法语法: super::methodName 
        list.forEach(super::print);
    }
}

class BaseExample {
    public void print(String content){
        System.out.println(content);
    }
}

 

类构造器语法使用例子:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
 * 
 * @author zhoufy
 * @date 2019年2月20日 下午2:19:13
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan("com.zhoufy")
public class Example {

    @Test
    public void test() {
        InterfaceExample com =  Example::new;
        Example bean = com.create();    
        System.out.println(bean);
    }
}

interface InterfaceExample{
    Example create();
}

 

如果是带参数的构造器,示例如下:

/**
 * @author zhoufy
 * @date 2019年2月20日 下午2:19:13
 */
public class Example {
    
    private String name;
    
    Example(String name){
        this.name = name;
    }
    
    public static void main(String[] args) {
        InterfaceExample com =  Example::new;
        Example bean = com.create("hello world");
        System.out.println(bean.name);
    }
}
interface InterfaceExample{
    Example create(String name);
}

这里需要特别注意的是:Example 类并没有implements InterfaceExample接口哦!!!

数组构造器语法使用例子:

import java.util.function.Function;

/**
 * @author zhoufy
 * @date 2019年2月20日 下午2:19:13
 */
public class Example {
    public static void main(String[] args) {
        Function <Integer, Example[]> function = Example[]::new;
        Example[] array = function.apply(4);    //这里的4是数组的大小
        
        for(Example e:array){
            System.out.println(e);    //如果输出的话,你会发现会输出4个空对象(null)
        }
    }
}

 

这里是借用jdk自带的java.util.function.Function类实现的,如果想要自定义接口

/**
 * 
 * @author zhoufy
 * @date 2019年2月20日 下午2:19:13
 */
public class Example {
    
    public static void main(String[] args) {
        Interface <Integer, Example[]> function = Example[]::new;
        Example[] array = function.apply(4);    //这里的4是数组的大小
        
        for(Example e:array){
            System.out.println(e);
        }
    }
}

@FunctionalInterface
interface Interface<A, T>{
    T apply(A a); 
}

 


————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/zhoufanyang_china/article/details/87798829

 

标签:冒号,Java,String,class,public,运算符,org,import,Example
From: https://www.cnblogs.com/ryelqy/p/18084702

相关文章

  • springboot/java/php/node/python情侣空间微信小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今社会,随着科技的迅猛发展和智能移动设备的普及,人们的社交方式正在经历着翻天覆地的变化。特别是年轻情侣之间,他们更倾向于通过数字化平台来表达情感......
  • springboot/java/php/node/python企业内部订餐小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着互联网科技的飞速发展,企业运营模式正逐步向数字化、智能化方向转型。在这一背景下,企业内部服务流程的优化变得尤为重要。订餐作为企业日常工作中不可......
  • JAVASE各模块结构图:面向对象、常用类、多线程、异常、IO流、集合、网络编程
    ......
  • 230_解决 | idea导航查看源码时总是出现 .class而不是 .java源码
    转载:https://www.yuque.com/yxrpangyu/kls5lq/sg8sh01、File-->Settings-->Maven-->importing(勾选上Sources和Documentation)2、右键项目的pom.xml-->Maven–>Reimport3、窗口右边点击MavenProjects完成下图操作下载即可注意:在下载的时候要保证你的电脑有网络。转换......
  • 深入浅出Java多线程(十三):阻塞队列
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十三篇内容:阻塞队列。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在多线程编程的世界里,生产者-消费者问题是一个经典且频繁出现的场景。设想这样一个情况:有一群持续不断地生产资源的线程(我们称之......
  • Java学习笔记:异常处理
    目录Java学习笔记:异常处理什么是异常异常体系结构:Error、Exception自定义异常Java学习笔记:异常处理​ **2024/3/19**什么是异常异常体系结构:Error、Exception自定义异常......
  • Java-委托
    概述Supplier、Function、Predicate、Consumer、BiFunction、BiPredicate、BiConsumer是Java函数式接口的一部分,它们用于定义不同类型的函数,从而在函数式编程中提供了更灵活的方式来处理数据。这些函数式接口可以通过Lambda表达式来实现,从而简化代码的编写。在函数式编程中,它们......
  • 【编程向导】JavaScript-基础语法-语句和声明二期讲解
    switch语句switch语句允许一个程序求一个表达式的值并且尝试去匹配表达式的值到一个case标签。如果匹配成功,这个程序执行相关的语句。语法switch(expression){casevalue_1:statements_1[break;]casevalue_2:statements_2[br......
  • 学习java第十七天
    SpringBoot是一个非常流行的Java开发框架,但在使用过程中也会遇到一些难点。以下是一些可能会遇到的问题及其解决方法:1、依赖冲突:在使用SpringBoot开发时,常常会遇到依赖冲突的问题。这种问题的解决方法有很多种,最常用的方法是使用Maven或Gradle这样的构建工具,手动指......
  • 纵横山河万里,终集 Java的错误和异常
    本篇会加入个人的所谓‘鱼式疯言’❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......