首页 > 编程语言 >Java8新特性之方法引用(三)

Java8新特性之方法引用(三)

时间:2023-10-12 18:14:58浏览次数:43  
标签:MethodReferencesTest 特性 Java8 num 引用 Integer CalculateEntity public r1

1. 方法引用介绍

方法引用其实是lambda表达式的升级写法,采用::固定语法,可以使代码更简洁、紧凑;

2. 方法引用的5种类型

2.1 对象引用::实例方法名

函数式接口抽象方法的形参列表与实例方法的一致,且方法的返回值类型一致;

public class MethodReferencesTest {

    public static void main(String[] args) {
        // 对象引用
        MethodReferencesTest methodReferencesTest = new MethodReferencesTest();
        // lambda表达式写法
        Integer r1 = MethodReferencesTest.getResult((a, b) -> methodReferencesTest.sum(a, b));
        System.out.println("r1:" + r1);
        // 方法引用(对象引用::实例方法名)写法
        Integer r2 = MethodReferencesTest.getResult(methodReferencesTest::sum);
        System.out.println("r2:" + r2);
    }

    public static Integer getResult(CalculateInterface calculateInterface) {
        return calculateInterface.calculate(123, 456);
    }

    /**
     * 实例方法
     */
    public Integer sum(Integer a, Integer b) {
        return a + b;
    }
}

@FunctionalInterface
interface CalculateInterface {
    /**
     * 函数式接口抽象方法
     */
    Integer calculate(Integer a, Integer b);
}

// 运行结果
r1:579
r2:579

2.2 类名::静态方法名

函数式接口抽象方法的形参列表与静态方法的一致,且方法的返回值类型一致;

public class MethodReferencesTest {

    public static void main(String[] args) {
        // lambda表达式写法
        Integer r1 = MethodReferencesTest.getResult((a, b) -> MethodReferencesTest.sum(a, b));
        System.out.println("r1:" + r1);
        // 方法引用(类名::静态方法名)写法
        Integer r2 = MethodReferencesTest.getResult(MethodReferencesTest::sum);
        System.out.println("r2:" + r2);
    }

    public static Integer getResult(CalculateInterface calculateInterface) {
        return calculateInterface.calculate(123, 456);
    }

    /**
     * 静态方法
     */
    public static Integer sum(Integer a, Integer b) {
        return a + b;
    }
}

@FunctionalInterface
interface CalculateInterface {
    /**
     * 函数式接口抽象方法
     */
    Integer calculate(Integer a, Integer b);
}

2.3 类名::实例方法名

函数式接口抽象方法的第一个参数是实例方法所在类的对象,剩下的参数(或无参)是实例方法的入参,且方法的返回值类型一致;

public class MethodReferencesTest {

    public static void main(String[] args) {
        // lambda表达式写法
        boolean r1 = MethodReferencesTest.getResult((a, b) -> a.equals(b));
        System.out.println("r1:" + r1);
        // 方法引用(类名::实例方法名)写法
        boolean r2 = MethodReferencesTest.getResult(CalculateEntity::equals);
        System.out.println("r2:" + r2);
    }

    public static Boolean getResult(CalculateInterface calculateInterface) {
        CalculateEntity a = new CalculateEntity(123);
        CalculateEntity b = new CalculateEntity(456);
        return calculateInterface.compare(a, b);
    }
}

class CalculateEntity {
    private Integer num;

    public CalculateEntity(Integer num) {
        this.num = num;
    }

    /**
     * 实例方法
     */
    public Boolean equals(CalculateEntity entity) {
        return this.num.equals(entity.num);
    }
}

@FunctionalInterface
interface CalculateInterface {
    /**
     * 函数式接口抽象方法
     */
    Boolean compare(CalculateEntity a, CalculateEntity b);
}

// 运行结果
r1:false
r2:false

2.4 类名::new

函数式接口抽象方法的形参列表与类的构造方法的一致,且抽象方法返回的类型是该类名的类型;

public class MethodReferencesTest {

    public static void main(String[] args) {
        // lambda表达式写法
        CalculateEntity r1 = MethodReferencesTest.getResult(num -> new CalculateEntity(num));
        System.out.println("r1:" + r1);
        // 方法引用(类名::new)写法
        CalculateEntity r2 = MethodReferencesTest.getResult(CalculateEntity::new);
        System.out.println("r2:" + r2);
    }

    public static CalculateEntity getResult(CalculateInterface calculateInterface) {
        return calculateInterface.generateEntity(123);
    }
}

class CalculateEntity {

    private Integer num;

    /**
     * 构造方法
     */
    public CalculateEntity(Integer num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "num = " + num;
    }
}

@FunctionalInterface
interface CalculateInterface {
    /**
     * 函数式接口抽象方法
     */
    CalculateEntity generateEntity(Integer num);
}

// 运行结果
r1:num = 123
r2:num = 123

2.5 类名[]::new

函数式接口抽象方法的参数是int类型或者Integer类型,表示数组长度,抽象方法的返回值类型是该类名类型的数组;

public class MethodReferencesTest {

    public static void main(String[] args) {
        // lambda表达式写法
        CalculateEntity[] r1 = MethodReferencesTest.getResult(length -> new CalculateEntity[length]);
        System.out.println("r1:" + Arrays.toString(r1));
        // 方法引用(类名[]::new)写法
        CalculateEntity[] r2 = MethodReferencesTest.getResult(CalculateEntity[]::new);
        System.out.println("r2:" + Arrays.toString(r2));
    }

    public static CalculateEntity[] getResult(CalculateInterface calculateInterface) {
        return calculateInterface.generateEntityArr(5);
    }
}

class CalculateEntity {

    private int num;

    @Override
    public String toString() {
        return "num = " + num;
    }
}

@FunctionalInterface
interface CalculateInterface {
    /**
     * 函数式接口抽象方法
     */
    CalculateEntity[] generateEntityArr(Integer length);
}

// 运行结果
r1:[null, null, null, null, null]
r2:[null, null, null, null, null]

来源:https://blog.csdn.net/gu19930914/article/details/115705383

标签:MethodReferencesTest,特性,Java8,num,引用,Integer,CalculateEntity,public,r1
From: https://www.cnblogs.com/hefeng2014/p/17760200.html

相关文章

  • Java8新特性之接口的默认方法和静态方法(四)
    1.背景介绍在Java8之前,接口中定义的方法都是抽象方法,即默认都是被publicabstract修饰的;但从Java8开始,允许在接口中定义带有方法体的默认方法和静态方法;publicclassInterfaceTest{publicstaticvoidmain(String[]args){}}interfaceInterfaceA{/*......
  • Java8新特性之函数式接口(二)
    1,函数式接口介绍前言:由于Java8中引入了lambda表达式语法,但该语法需要配合一种特定的接口才能使用,由此产生出了函数式接口;函数式接口指有且仅有一个抽象方法(由Object对象继承的方法不算)(但可以有多个默认方法和静态方法)的接口,当这样的接口在作为方法参数时可以隐式的转换为lambda......
  • Java8新特性之Lambda表达式(一)
    Java8新特性之Lambda表达式(一)文章目录1.lambda表达式介绍2.lambda表达式的重要特征3.lambda表达式对域外变量的限制4.lambda表达式的优缺点5.lambda表达式的使用场景6.lambda表达式的实现原理7.相关链接1.lambda表达式介绍lambda表达式是Java8提供的新特......
  • ASEMI整流桥KBU810参数,KBU810特性
    编辑-ZKBU810参数描述:型号:KBU810最大直流反向电压VR:1000V最大工作峰值反向电压VRWM:700V最大平均正向电流IF:8A非重复正向浪涌电流IFSM:300A操作和储存温度范围TJ,TSTG:-55to150℃正向电压VF:1.1V最大反向泄漏电流IRM:10uA每个元件的典型热阻RthJA:2.7℃/W KBU810封装规格:封装:KBU-4总......
  • Java 1.8 list特性用法
    list转换成具体的字符串拼接@TestpublicvoidListToString(){//构造listList<String>list=Arrays.asList("张三","李四","王五","赵六");//以逗号分隔,带前缀后缀Stringstr1=list.stream().collect(Collectors.joining(&q......
  • Python - 深拷贝一个带有指向自身引用的列表,会报错么?紧接着用==比较,会报错么?
    问题描述深拷贝一个带有指向自身引用的列表:列表x中有指向自身的引用,因此x是一个无限嵌套的列表。importcopyx=[1]x.append(x)>>x[1,[...]]y=copy.deepcopy(x)>>y[1,[...]] 深拷贝不报错但是我们发现深度拷贝x到y后,程序并没有出现stackoverf......
  • Java 方法引用
    目录定义使用条件使用方式匿名类lambda表达式::引用已有方法总结定义将方法作为参数传递即为方法引用。以@FunctionalInterface修饰的接口其中只能有一个抽象方法。这个抽象方法的形参和返回值便是对所引用方法的约束。使用条件引用方法的返回值类型和形参需要与函数式接......
  • 开发者笔记 C++11新特性并发编程future
    上一篇介绍了<thread>文件里线程相关类,这篇将介绍C++<future>头文件里线程类,future里包含的类主要是处理异步任务,线程函数封装,线程间通信,同步,捕捉异常处理https://zhuanlan.zhihu.com/p/509118687future的引入c++11引入的future是为了解决异步通信问题的。future可以看做是数......
  • Spring Boot 2.6.0 发布,一大波新特性,禁止了循环依赖,还有哪些更新
    1、默认禁止了循环依赖循环依赖大家都知道,也被折磨过,这下2.6.0的版本默认禁止了循环依赖,如果程序中出现循环依赖就会报错。当然并没有一锤子打死,也提供了开启允许循环依赖的配置,只需要在配置文件中开启即可:spring:main:allow-circular-references:true2、支持自定义脱敏规......
  • C++11新特性之基本范围的For循环(range-based-for)
    C++11新特性之基本范围的For循环(range-based-for)最新推荐文章于 2023-07-2219:30:58 发布Rayen0715于2017-01-0713:49:35发布49588收藏174版权Range-Based-For熟悉C++98/......