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

目录

方法引用

再介绍

应用案例

①准备测试类MethodRefTest

②测试对象::实例方法的方法引用

③测试类名::静态方法的方法引用,代码如下

④测试类名::实例方法的方法引用

测试类MethodRefTest 详细代码


方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! ( 实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致! ) 方法引用:使用操作符 “ :: ” 将方法名和对象或类的名字分隔开来。
如下三种主要使用情况
对象::实例方法
类::静态方法
类::实例方法

再介绍

方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用
  			  (可以将方法引用理解为 Lambda 表达式的另外一种表现形式)
  
  1. 对象的引用 :: 实例方法名
  
  2. 类名 :: 静态方法名
  
  3. 类名 :: 实例方法名
  
  注意:
  	 ①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
  	 ②若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName

应用案例

①准备测试类MethodRefTest

package com.csdn.test;

import com.csdn.entity.Employee;

/**
 * @author summer
 * @date 2022-04-16  10:20
 */
public class MethodRefTest {

    Employee employee = new Employee("zhangsan",18,888.0);


}

②测试对象::实例方法的方法引用

在测试类中加入如下测试方法

    @Test
    public void test1(){
        //比如我们需要输出一个字符串
        Consumer<String> con1 = str -> System.out.println(str);
        con1.accept("helloworld");
        //方法引用 对象::实例方法
        Consumer<String> con2 = System.out::println;
        con2.accept("goodmorning");

    }

再比如获取employee对象的姓名或者年龄,我们同样可以使用对象::实例方法来实现,代码如下

    @Test
    public void test2() {
        //获取employee对象的姓名方式一
        Supplier<String> s1 = () -> employee.getName();
        System.out.println(s1.get());
        //获取employee对象姓名方式二,方法引用
        Supplier<String> s2 = employee::getName;
        System.out.println(s2.get());


        //获取employee对象的年龄方式一
        Supplier<Integer> s3 = ()->employee.getAge();
        System.out.println(s3.get());
        //获取employee对象的年龄方式二 方法引用
        Supplier<Integer> s4 = employee::getAge;
        System.out.println(s4.get());
    }

③测试类名::静态方法的方法引用,代码如下

    @Test
    public void test3(){
        //获取两个Double型数据的最大值并返回
//        Lambda的做法
        BiFunction<Double,Double,Double> fun1 =(x,y)->Math.max(x,y);
        System.out.println(fun1.apply(34.5,77.8));
//        类::静态方法的方法引用
        BiFunction<Double,Double,Double> fun2 = Math::max;
        System.out.println(fun2.apply(90.8,66.4));
    }

    @Test
    public void test4(){
        //比较两个int型的大小
//        方式一 ,使用Lambda
        Comparator<Integer> com1 = (x,y)->Integer.compare(x,y);
        System.out.println(com1.compare(33,44));
//        方式二,使用方法引用
        Comparator<Integer> com2 = Integer::compare;
        System.out.println(com2.compare(44,33));
    }

④测试类名::实例方法的方法引用

    @Test
    public void test5(){
        //比较两个字符串内容是否相同

//        方式一 Lambda
        BiPredicate<String,String> pre1 =  (x,y)->x.equals(y);
        System.out.println(pre1.test("abc","abc"));
//        方式二 方法引用
        BiPredicate<String,String> pre2 = String::equals;
        System.out.println(pre2.test("abc","obc"));

    }

    @Test
    public void test6(){
        //获取传进来的employee对象的姓名

//        方式一Lambda
        Function<Employee,String> f1 = e->e.getName();
        System.out.println(f1.apply(new Employee("good",12,22.22)));
//        方式二方法引用
        Function<Employee,String> f2 = Employee::getName;
        System.out.println(f2.apply(new Employee("world",33,33.3)));
    }

测试类MethodRefTest 详细代码

package com.csdn.test;

import com.csdn.entity.Employee;
import org.junit.Test;

import java.util.Comparator;
import java.util.function.*;

/**
 * @author summer
 * @date 2022-04-16  10:20
 */
public class MethodRefTest {

    Employee employee = new Employee("zhangsan", 18, 888.0);

    @Test
    public void test5(){
        //比较两个字符串内容是否相同

//        方式一 Lambda
        BiPredicate<String,String> pre1 =  (x,y)->x.equals(y);
        System.out.println(pre1.test("abc","abc"));
//        方式二 方法引用
        BiPredicate<String,String> pre2 = String::equals;
        System.out.println(pre2.test("abc","obc"));

    }

    @Test
    public void test6(){
        //获取传进来的employee对象的姓名

//        方式一Lambda
        Function<Employee,String> f1 = e->e.getName();
        System.out.println(f1.apply(new Employee("good",12,22.22)));
//        方式二方法引用
        Function<Employee,String> f2 = Employee::getName;
        System.out.println(f2.apply(new Employee("world",33,33.3)));
    }


    @Test
    public void test3(){
        //获取两个Double型数据的最大值并返回
//        Lambda的做法
        BiFunction<Double,Double,Double> fun1 =(x,y)->Math.max(x,y);
        System.out.println(fun1.apply(34.5,77.8));
//        类::静态方法的方法引用
        BiFunction<Double,Double,Double> fun2 = Math::max;
        System.out.println(fun2.apply(90.8,66.4));
    }

    @Test
    public void test4(){
        //比较两个int型的大小
//        方式一 ,使用Lambda
        Comparator<Integer> com1 = (x,y)->Integer.compare(x,y);
        System.out.println(com1.compare(33,44));
//        方式二,使用方法引用
        Comparator<Integer> com2 = Integer::compare;
        System.out.println(com2.compare(44,33));
    }


    @Test
    public void test2() {
        //获取employee对象的姓名方式一
        Supplier<String> s1 = () -> employee.getName();
        System.out.println(s1.get());
        //获取employee对象姓名方式二,方法引用
        Supplier<String> s2 = employee::getName;
        System.out.println(s2.get());


        //获取employee对象的年龄方式一
        Supplier<Integer> s3 = ()->employee.getAge();
        System.out.println(s3.get());
        //获取employee对象的年龄方式二 方法引用
        Supplier<Integer> s4 = employee::getAge;
        System.out.println(s4.get());
    }

    @Test
    public void test1() {
        //比如我们需要输出一个字符串
        Consumer<String> con1 = str -> System.out.println(str);
        con1.accept("helloworld");
        //方法引用 对象::实例方法
        Consumer<String> con2 = System.out::println;
        con2.accept("goodmorning");

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

喜欢编程的夏先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值