Java8中的双冒号操作符


一、定义

就是Java 8中的Lambda写法

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

1、常用语法

  1. 静态方法引用(static method)语法:classname::methodname 例如:Person::getAge
  2. 对象的实例方法引用语法:instancename::methodname 例如:System.out::println
  3. 对象的超类方法引用语法: super::methodname
  4. 类构造器引用语法: classname::new 例如:ArrayList::new
  5. 数组构造器引用语法: typename[]::new 例如: String[]:new

二、介绍

1、静态方法语法


@SpringBootTest
class MyJavaTestApplicationTests {
 
    @Test
    public void test23() {
        List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
        //静态方法语法	ClassName::methodName
        list.forEach(MyJavaTestApplicationTests::print);
    }

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

2、类实例方法语法

@SpringBootTest
class MyJavaTestApplicationTests {
    @Test
    public void test24() {
        List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");

        //对象实例语法	instanceRef::methodName
        list.forEach(new MyJavaTestApplicationTests()::print2);
    }

    public void print2(String content){
        System.out.println(content);
    }
}

3、超类方法语法

@SpringBootTest
class MyJavaTestApplicationTests extends BaseExample{
    @Test
    public void test25() {
        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);
    }
}

4、类构造器语法

@SpringBootTest
class MyJavaTestApplicationTests {
    @Test
    public void test26() {
        InterfaceExample com =  MyJavaTestApplicationTests::new;
        MyJavaTestApplicationTests bean = com.create();
        System.out.println(bean);
    }
}

interface InterfaceExample{
    MyJavaTestApplicationTests create();
}

如果是带参数的构造器,示例如下:
这里需要特别注意的是:Example 类并没有implements InterfaceExample接口

@SpringBootTest
class MyJavaTestApplicationTests {
    @Test
    public void test27() {
        InterfaceExample com = ExTest::new;
        ExTest bean = com.create("hello world");
        System.out.println(bean.getName());
    }
}
public class ExTest {
    private String name;

    public ExTest(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public interface InterfaceExample {
    ExTest create(String name);
}

5、类实例方法语法

import java.util.function.Function;

@SpringBootTest
class MyJavaTestApplicationTests {
 @Test
    public void test28() {
        Function<Integer, ExTest[]> function = ExTest[]::new;
        ExTest[] array = function.apply(4);    //这里的4是数组的大小

        for (ExTest e : array) {
            System.out.println(e);
        }
    }
}

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

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

@SpringBootTest
class MyJavaTestApplicationTests {
 @Test
    public void test29() {
        Interface <Integer, ExTest[]> function = ExTest[]::new;
        ExTest[] array = function.apply(4);    //这里的4是数组的大小

        for (ExTest e : array) {
            System.out.println(e);
        }
    }
}

三、案例

/**
 * @author lichangyuan
 * @create 2022-03-02 13:34
 */
public class MyUtil {

    /**
     * 对要遍历的元素添加add操作
     */
    public void addString1(String x) {
        System.out.println(x + "add");
    }

    /**
     * 对要遍历的元素添加add操作
     */
    public static void addString2(String x) {
        System.out.println(x + "add");
    }

    /**
     * 对要遍历的元素添加逻辑操作
     */
    public void judgeInt(int i) {
        if(i%2==0){
            System.out.println(i+"是偶数");
        }else{
            System.out.println(i+"是奇数");
        }
    }

    /**
     * 对要遍历的元素添加逻辑操作
     */
    public Integer fixInt(int i) {
        if(i%2==0){
            return i;
        }else{
            return i+1;
        }
    }
}
@SpringBootTest
class MyJavaTestApplicationTests {
    @Test
    void contextLoad21() {
        List<String> stringList = Arrays.asList("a", "b", "c");

        stringList.forEach(System.out::println);
        System.out.println("=================================================");

        stringList.forEach(new MyUtil()::addString1);
        System.out.println("=================================================");

        stringList.forEach(MyUtil::addString2);
        System.out.println("=================================================");

        List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
        integerList.forEach(new MyUtil()::judgeInt);
        System.out.println("=================================================");
    }
}

在这里插入图片描述

  • 坚持不懈,追求自己的梦想,即使路途崎岖,也要勇敢前行,终将收获成功的果实。
  • 不要被过去的失败所困扰,用智慧和勇气开创美好的未来,每一次努力都是成长的脚印。
  • 保持积极的心态,把握当下的每一个机会,勇敢地面对挑战,你将发现自己的无限可能。
  • 拥有坚定的信念和不屈的意志,即使困难重重,也要坚持不懈,成功的曙光就在前方。
  • 不要害怕失败,它是成功之母;不要畏惧困难,它是成长的阶梯。只有勇敢面对,才能走向辉煌。
  • 努力不一定能成功,但放弃一定不会成功。坚持到底,你会发现,成功已经在不远的地方等待着你。
  • 相信自己的能力,即使别人不看好你,也要坚定地走自己的路,成功的光芒会照耀你的前方。
  • 在人生的道路上,不要停下脚步,不要停止探索,勇敢地向前,你会发现生活的美好和意义。
  • 无论遇到什么困难,都要保持微笑和乐观,因为坚持和希望会给你带来无穷的力量和勇气。
  • 生活会给你带来无数的挑战,但只要你不放弃,勇敢面对,你就一定会收获属于自己的辉煌。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和烨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值