lambda表达式4种方法引用

引用地址:【Java-API】lambda表达式4种方法引用_lambad方法引用-CSDN博客

lambda表达式就是对匿名内部类的简写和优化(要求接口必须是函数式接口@Functional Interface(即接口中有且只有一个抽象方法(注意:与Object公共类相同的不计入抽象方法))但是可以有多个非抽象方法),方法引用就是对lambda表达式的优化和简写。

首先lambda表达式4种方法引用可以归纳为下列4种:

1,静态方法引用

2,实例方法引用

3,构造方法引用

4,特殊方法引用

那么就直接进行举例说明:
第一种:静态方法引用

静态方法/类方法(static修饰的方法)引用
        语法:类名::方法名

注意事项:
        被引用的方法参数列表和函数式接口中抽象方法的参数一致!!
        接口的抽象方法没有返回值,引用的方法可以有返回值也可以
        没有接口的抽象方法有返回值,引用的方法必须有相同类型的返回值!!
        由于满足抽象参数列表与引用参数列表相同,所以可以写成静态方法引用的格式

案例:(将字符串转换成Integer类型)

函数式接口

    /**
     * 通过以下接口实现匿名内部类,lambda表达式,静态方法引用
     * public interface MyInterface{
        Integer strToInt(String str);
        }
     * 底层适用:Integer.parseint()实现
     *创建一个接口
     *抽象方法为Integer strToInt(String str);
     */
    public interface MyInterface {
        //抽象方法
        Integer strToInt(String str); //将字符串转换成Integer类型
    }

测试类

    /**
     * 接口测试类 1.通过以下接口实现匿名内部类,
     * lambda表达式,静态方法引用 public interface MyInterface{
     *  Integer strToInt(String str); }
     * 底层适用:Integer.parseint()实现
     * 静态方法引用
            语法:类名::方法名
            注意事项:
            被引用的方法参数列表和函数式接口中抽象方法的参数一致!!
            接口的抽象方法没有返回值,引用的方法可以有返回值也可以
            没有接口的抽象方法有返回值,引用的方法必须有相同类型的返回值!!
            由于满足抽象参数列表与引用参数列表相同,所以可以写成静态方法引用的格式
     */
    public class MyInterfaceTest {
        public static void main(String[] args) {
            // 利用匿名内部类的方式
            MyInterface my = new MyInterface() {
                // 底层适用:Integer.parseint()实现
                @Override
                public Integer strToInt(String str) {
                    // 参数为String类型,返回值类型为int类型(会自动进行装箱)
                    return Integer.parseInt(str);  //方法是static修饰的 为静态方法
                }
            };
     
            // 采用lambda表达式进行优化
            MyInterface my1 = str -> Integer.parseInt(str);
            
            // 采用静态方法引用
            MyInterface my2 =  Integer::parseInt;
     
            // 调用方法 非static修饰 对象名.方法名()
            System.out.println(my.strToInt("1261542"));
            System.out.println(my1.strToInt("134343"));
            System.out.println(my2.strToInt("134343"));
     
        }
     
    }

第二种:实例方法引用

实例方法(非static修饰的方法)引用
        语法:对象名:∶非静态方法名

注意事项:
被引用的方法参数列表和函数式接口中抽象方法的参数一致!!

接口的抽象方法没有返回值,引用的方法可以有返回值也可以没有

接口的抽象方法有返回值,引用的方法必须有相同类型的返回值! !

案例:给你一个字符串【数字】  判断是否是以.png结尾的

函数式接口

    // 给你一个字符串  判断是否是以.png结尾的
    public interface MyInterface {
        //抽象方法
        Boolean judgeSuffix(String str);// 参数是字符串,返回值是Boolean类型
    }

测试类

    package cn.meituan.lambdainstancequote11111;
     
    /**
     * 给你一个字符串 判断是否是以.png结尾的
     * 实例方法(非static修饰的方法)引用
            语法:对象名:∶非静态方法名
        注意事项:
        被引用的方法参数列表和函数式接口中抽象方法的参数一致!!    
        接口的抽象方法没有返回值,引用的方法可以有返回值也可以没有    
        接口的抽象方法有返回值,引用的方法必须有相同类型的返回值! !
     */
    public class MyInterfaceTest {
        public static void main(String[] args) {
            String s = "默默无闻的你.png";
            // 采用匿名内部类方法
            MyInterface my = new MyInterface() {
     
                @Override
                public Boolean judgeSuffix(String str) {// 参数为字符串类型(输入的是结尾)
                                                        // 返回值为Boolean类型
                    // 字符串【数字】 判断是否是以.png结尾的
                    return s.endsWith(str);// 调用s.endsWith(没有static修饰)的实例方法
                }
            };
     
            // 采用lambda表达式进行优化简化代码
            MyInterface my1 =  str ->  s.endsWith(str);
            
            // 采用实例方法引用进行简写
            MyInterface my2 =  s::endsWith;
     
            // 调用方法输出结果
            System.out.println(my.judgeSuffix(".png"));
            System.out.println(my1.judgeSuffix(".png"));
            System.out.println(my2.judgeSuffix(".png"));
        }
    }

第三种:构造方法引用

构造方法引用
        语法:类名::new

注意事项:
        被引用的类必须存在一个构造方法与函数式接口的抽象方法参数列表一致

案例:利用构造方法将String字符串转换成Integer类型

函数式接口

    public interface MyInterface {
        //抽象方法
        Integer strToInt(String str);
    }

测试类

    /**
     * 接口测试类 构造方法引用
     * 利用构造方法将String字符串转换成Integer类型
     *
     * 构造方法引用
            语法:类名::new
        注意事项:
            被引用的类必须存在一个构造方法与函数式接口的抽象方法参数列表一致
     */
    public class MyInterfaceTest {
        public static void main(String[] args) {
            // 采用匿名内部类的方式
            MyInterface my = new MyInterface() {
     
                @Override
                public Integer strToInt(String str) {
                    // Integer integer = new
                    // Integer(str);//创建一个构造方法将String类型转换成Integer类型(自动装箱)
                    return new Integer(str); // 方法是一个构造方法
                }
            };
     
            // 采用lambda表达式对匿名内部类进行优化
            MyInterface my1 =  str ->  new Integer(str);
            
            // 采用构造方法引用进行简化代码
            MyInterface my2 =  Integer::new;
     
            // 调用方法输出结果
            System.out.println(my.strToInt("232434"));
            System.out.println(my1.strToInt("232434"));
            System.out.println(my2.strToInt("232434"));
        }
    }

第四种:特殊方法引用

特殊方法引用

        语法:类名::实例方法名

注意事项:
        在抽象方法中,参数作为实例方法调用者,就可以简化


需求:判断参数t是否为空字符串

函数式接口

    public interface MyInterface {
        //抽象方法
        Boolean empty(String str);
     
    }

测试类

    package cn.meituan.lambdaspecialinstancequote11111;
     
    /**
     * 需求:给你一个字符串, 判断是否为空
     * 特殊方法引用
          语法:类名::实例方法名
     *
     */
    public class MyInterfaceTest {
        public static void main(String[] args) {
            // 采用匿名内部类方法
            MyInterface my = new MyInterface() {
     
                @Override
                public Boolean empty(String str) {// 参数为字符串类型(输入的字符串)
                                                    // 返回值为Boolean类型
                    // 字符串【数字】 判断是否为空
     
                    return str.isEmpty();// 特殊实例方法引用
                }
            };
     
            // 采用lambda表达式进行优化简化代码
            MyInterface my1 =  str -> str.isEmpty();
     
     
            // 采用实例方法引用进行简写    格式: 类名(数据类型的类)::实例方法名
     
            MyInterface my2 =  String::isEmpty;
            
            // 调用方法输出结果
            System.out.println(my.empty("sdsdsd"));// false
            System.out.println(my1.empty(""));// true
            System.out.println(my2.empty(""));// true
        }
     
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lambda表达式可以用来创建匿名函数,而特殊实例方法引用lambda表达式的一特殊用法。特殊实例方法引用允许将已经存在的实例方法作为lambda表达式的实现。它的语法形式是 `ClassName::methodName`,其中ClassName是类名,methodName是方法名。 下面是一个具体的示例: ```java import java.util.function.Predicate; public class LambdaMethodReferenceExample { public static void main(String[] args) { String str = "hello"; // 使用lambda表达式 Predicate<String> lambdaPredicate = s -> str.startsWith(s); System.out.println(lambdaPredicate.test("he")); // 输出:true // 使用特殊实例方法引用 Predicate<String> methodReferencePredicate = str::startsWith; System.out.println(methodReferencePredicate.test("he")); // 输出:true } } ``` 在上面的示例中,我们使用了lambda表达式和特殊实例方法引用来创建一个Predicate(断言)对象。该断言对象用于判断给定的字符串是否以指定字符串开头。 在lambda表达式中,我们使用了`s -> str.startsWith(s)`来表示一个函数,其中`s`是传入的参数,`str.startsWith(s)`是函数的实现。 而在特殊实例方法引用中,我们使用了`str::startsWith`来表示函数的实现,它等价于`String::startsWith`,其中`str`是方法的调用者,`startsWith`是方法名。 需要注意的是,特殊实例方法引用只能用于那些不接受任何参数的方法,或者第一个参数是调用者的方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值