黑猴子的家:Java 8 -> 方法引用进阶

本文深入探讨Java中的方法引用,一种简化Lambda表达式的语法糖。通过三个测试案例,演示了如何使用对象名调用实例方法、使用类名调用静态方法以及使用类名调用实例方法。比较了匿名内部类、Lambda表达式和方法引用的不同实现方式,突出了方法引用的简洁性和实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、test1-使用对象名,调用实例方法

package com.yinggu.demo7;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import org.junit.Test;
import com.yinggu.domain.Employee;

 * @author 黑猴子的家 
 * https://www.jianshu.com/u/37fd8e2dff4c
 * 
 * 此类用于演示方法引用
 * 特点:
 * 方法引用相当于对某种具备特殊要求 的Lambda表达式的代替,目的是为了语法更加简洁!!!
 * 
 * 语法:
 * 类名或对象::方法名
 * 注意:没有参数列表
 * 
 * 要求:
 * 情况1:类名调用静态方法
 * 情况2:对象调用实例方法
 * 满足: 函数式接口的抽象方法的参数列表和返回值类型 
   必须与方法体中的 要调用方法的 参数列表和返回值类型相同
 * 
 * 情况3:类名调用实例方法
 * 满足:
 * (1)函数式接口的抽象方法的返回类型和方法体中要调用方法的返回类型相同
 * (2)函数式接口的第一个参数肯定是方法体中要调用方法的调用者
 * 
 * 经典案例
 * Consumer con = System.out::println;

public class TestMethodRef1 {
      //使用对象名调用实例方法
      /*
       * 1、函数式接口的抽象方法的参数列表和返回值类型
      必须和方法实现中要调用方法的 参数列表和返回类型相同
       */
      @Test 
      public void test1() {
            
            System.out.println("------------匿名内部类---------------");
            //使用匿名内部类
            Consumer<Integer> con= new Consumer<Integer>() {
                  @Override
                  public void accept(Integer t) {
                        System.out.println(t);
                  }
            };
            con.accept(100);
            
            System.out.println("\n------------Lambda表达式---------------");
            //使用Lambda表达式
            Consumer<Integer> con1 = t->System.out.println(t);
            con1.accept(100);
            
            System.out.println("\n------------方法引用---------------");
            //使用方法引用
            Consumer<Integer> con2 = System.out::println;
            con2.accept(100);
      }
}

2、test2-使用类名调用静态方法

//使用类名调用静态方法

 函数式接口的抽象方法的参数列表和返回值类型
必须和方法实现中要调用方法的 参数列表和返回类型相同

@Test 
public void test2() {
      //使用匿名内部类
      Comparator<Double> com =new Comparator<Double>() {
            
            @Override
            public int compare(Double o1, Double o2) {
                  return Double.compare(o1, o2);
            }
      };

      System.out.println(com.compare(100.9, 23.5));
      System.out.println("---------------------------");
      
      //使用Lambda表达式
      Comparator<Double> com1 = (o1,o2)->Double.compare(o1, o2);
      System.out.println(com1.compare(100.9, 23.5));
      System.out.println("---------------------------");
      
      //使用方法引用
      Comparator<Double> com2 = Double::compare;
      System.out.println(com2.compare(100.9, 23.5));
}

3、test3-使用类名调用实例方法

//使用类名调用实例方法

 * 要求:
 * 1、函数式接口的抽象方法返回值类型
     必须和方法实现中
     要调用方法的 返回类型相同
 * 2、函数式接口的抽象方法的第一个参数
   必须和方法实现中 要调用方法的调用者一样

@Test 
public void test3() {
      Comparator<String> com = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                  return o1.compareTo(o2);
            }
      };
      System.out.println(com.compare("john", "jack"));
      System.out.println("---------------------------");
      //使用Lambda表达式
      Comparator<String> com1 = (o1,o2)->o1.compareTo(o2);
      System.out.println(com1.compare("john", "jack"));
      System.out.println("---------------------------");
      
      //使用方法引用
      Comparator<String> com2 = String ::compareTo;
      System.out.println(com2.compare("john", "jack"));
      System.out.println("---------------------------");
      
      //测试二------------------------------------------
      Function<Employee,String>  fun = new Function<Employee,String>(){
            @Override
            public String apply(Employee t) {
                  return t.getName();
            }
      };
      Function<Employee,String> fun1 = e-> e.getName();
      Function<Employee,String> fun2 = Employee::getName;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值