java8新特性-方法引用和构造器引用

本文介绍Java8中的方法引用和构造器引用,包括其实现格式与应用场景,并通过示例代码展示了不同引用方式的使用方法。

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

概述

java8新特性中给我们提供了方法引用和构造器的引用,可以让我们在编程的时候更见快捷方便,够装逼。前面的博客中已经对java8中的新特性,lambda表达式,函数式编程等进行了学习,如果看懂了前面的这里就很简单了。有疑问的小伙伴可以看看前面的文章进行学习,这里进行java8中方法的引用和构造器的引用进行学习。

方法引用和构造器引用

方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用
(可以将方法引用理解为 Lambda 表达式的另外一种表现形式)
格式:

  1. 对象的引用 :: 实例方法名

  2. 类名 :: 静态方法名

  3. 类名 :: 实例方法名

import org.junit.Test;
import java.io.PrintStream;
import java.util.*;
import java.util.function.*;

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

    //对象的引用 :: 实例方法名
    @Test
    public void test1(){
        List<String> list = Arrays.asList("java","spark","hadoop","scala");
        list.forEach( x -> System.out.println(x) );

        PrintStream out = System.out;
        list.forEach( x -> out.println(x) );

        list.forEach(System.out::println);
    }

    //对象的引用 :: 实例方法名
    @Test
    public void test2(){
        User user = new User(1,"飞飞",26,17000.00);
        Supplier<String> sp = () -> user.getName();
        System.out.println(sp.get());

        Supplier<String> sp1 = user::getName;
        System.out.println(sp1.get());
    }

    //类名 :: 静态方法名

    /**
     * 静态方法:compare
     * public static int compare(int x, int y) {
     *         return (x < y) ? -1 : ((x == y) ? 0 : 1);
     *     }
     */
    @Test
    public void test3(){
        Comparator<Integer> cm = (x,y) -> Integer.compare(x,y);

        Comparator<Integer> cm1 = Integer::compare;
    }

    //类名 :: 实例方法名
    @Test
    public void test4(){
        BiPredicate<String,String> bp = (x,y) -> x.equals(y);
        System.out.println(bp.test("aaa", "bbb"));

        BiPredicate<String,String> biPredicate = String::equals;
    }

    //类名 :: new
    @Test
    public void test5(){
        //和user类中的构造器参数保持一致
        Function<Integer,User> function = User::new;
        User user1 = function.apply(1001);
        System.out.println(user1);

        Function<Integer,User> fu = (x) -> new User(x);
        User user = fu.apply(1);
        System.out.println(user);

        BiFunction<Integer,String,User> bf = User::new;
        User jack = bf.apply(001, "jack");
        System.out.println(jack);

        BiFunction<Integer,String,User> bf1 = User::new;
        User tom = bf.apply(002, "tom");
        System.out.println(tom);

    }

    //数组引用
    @Test
    public void test6(){
        Function<Integer,String []> fc = x-> new String[x];

        Function<Integer,String []> fc1 = String[]::new;
    }

}

注意:
①方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!
②若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值