Java8 - 函数式接口以及方法引用

本文介绍了Java8中Lambda表达式的基本概念及其应用场景,并详细解释了方法引用的概念、使用格式及三种常见的情况。同时,还介绍了构造器引用和数组引用的相关内容。

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

什么是函数式接口

  • 只包含一个抽象方法的接口,称为函数式接口。
  • 你可以通过Lambda表达式来创建该接口的对象。( 若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
  • 我们可以在一个接口上使用@Functionallnterface注解,这样做可以检查它是否是一个函数式接口。同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。
  • 在java.util.function包下定义了Java 8的丰富的函数式接口

在这里插入图片描述
在这里插入图片描述

方法引用

  • 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
  • 方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lalmbda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。
  • 要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的
    方法的参数列表和返回值类型保持一致!
  • 格式:使用操作符“:” 将类(或对象)与方法名分隔开来。
    如下三种主要使用情况:
    ➢对象::实例方法名
    ➢类::静态方法名
    ➢类::实例方法名
//    1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
//    2.方法引用,本质上就是Lambda表达式, 而Lambda表达式作为函数式接口的实例。
//    所以方法引用, 也是函数式接口的实例。
//    3.使用格式: 类(或对象) ::方法名
//    4.具体分为如下的三种情况:
//       对象::非静态方法
//       类::静态方法
//       类::非静态方法!!!



//    要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!(针对前两种情况)
package JAVA8.Lambda_;

import org.junit.jupiter.api.Test;

import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.Consumer;

public class LambdaStudy03 {
//    1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
//    2.方法引用,本质上就是Lambda表达式, 而Lambda表达式作为函数式接口的实例。
//    所以方法引用, 也是函数式接口的实例。
//    3.使用格式: 类(或对象) ::方法名
//    4.具体分为如下的三种情况:
//       对象::非静态方法
//       类::静态方法
//       类::非静态方法!!!



//    要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!(针对前两种情况)

    //情况一:对象::实例方法 Consumer的void accept(T t)和PrintStream中的void println(T t)
    @Test
    public void test01(){
        Consumer<String> consumer = str -> System.out.println(str);
        consumer.accept("Beijing");

        //方法引用
        PrintStream ps = System.out;
        Consumer<String> consumer1 = ps::println;
        consumer1.accept("Shanghai");
    }

    //情况二:类::静态方法 Comparator 中的int compare(T t1,T t2) Integer中的int compare(T t1,T t2)
    @Test
    public void test02(){
        Comparator<Integer> comparator = (t1,t2) -> Integer.compare(t1,t2);
        System.out.println(comparator.compare(12,21));

        //方法引用
        Comparator<Integer> comparator1 = Integer::compare;
        comparator1.compare(12,21);
    }

    //情况三:类::非静态方法(难) Comparator中的int comapre( T t1,T t2)  String中的int t1.compareTo(t2)
    @Test
    public void test03(){
        Comparator<String> comparator = (s1,s2) -> s1.compareTo(s2);
        System.out.println(comparator.compare("abc","bcd"));

        Comparator<String> comparator1 = String::compareTo; //当第一个参数做为第二个参数的调用者时也可以使用
    }
}

构造器引用和数组引用

package JAVA8.Lambda_;

import SE1.Array;
import org.junit.jupiter.api.Test;
import src.Homework.Employee;

import java.util.Arrays;
import java.util.function.Function;
import java.util.function.Supplier;

public class LambdaTest04 {

    @Test
    public void test01(){
        Supplier<Employee> supplier = ()-> new Employee();   //构造器Lambda
        System.out.println(supplier.get());

        Supplier<Employee> supplier1 = Employee::new;   //构造器引用
        System.out.println(supplier1.get());
    }

    @Test
    public void test02(){
        Function<Integer,String[]> function = length -> new String[length]; //数组Lambda
        String []arr1 = function.apply(5);
        System.out.println(Arrays.toString(arr1));

        Function<Integer,String[]> function1 = String[]::new;   //数组引用
        String[] apply = function1.apply(8);
        System.out.println(Arrays.toString(apply));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值