理解:Java核心函数式接口具体实现中,方法与lambda表达式的关系

疑惑:

下面代码中,比如

public static ArrayList<String> my4test(String[] s, Predicate<String> pre){
        ArrayList<String> strings = new ArrayList<>();
        for(String s4:s){
                boolean test = pre.test(s4);
                if(test){
                    strings.add(s4);
                }
        }
        return strings;
    }

ts -> ts.contains("里")

实现的不是一样吗?功能不是重复了吗?加上又是方法,又是函数式接口的,彼此之间的关系作何理解?


其实很简单,函数式接口每一个都有其对应的抽象方法,我们在定义方法时,是直接用了它的方法,但其实里面没有任何定义。而在方法的具体实现时,lambda关系式的->右边就相当于我们补充的方法实现的具体规则。
 /**
         * accept():System.out.println("消费掉:"+integer);
         * get():s
         * apply():integer*100
         * test():contains("里")
         */

完整代码及具体例子:


package cn.code.day4_22_lambdaTest;

import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @Auther:sommer1111
 * @date 2020/4/25 9:22
 */
public class FunctionalTest {
    public static void main(String[] args) {
        //函数式接口的测试:Consumer<T>,
        //也就是,Lambda的左边以及相当于这一串
        // integer = new Consumer<Integer>() {@Override public void accept(Integer integer) {}
        //右边可以理解为函数式方法的具体规则,这个才是我们具体要写的。
        //在方法的定义里面,我们则默认规则已经指定————>这就是"函数式"的贴切性!
       


        //1.Consumer只负责接收数据,没有返回值。
        my1test(100, new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println("消费掉:"+integer);
            }
        });
        System.out.println("-------------------------------");
        //lambda表达式的测试
        my1test(90,integer -> System.out.println("消费掉"+integer));

        //2.Supplier测试,这里比较难理解,空参调用它,获取你想要获取得东西(对象、属性)。

        String s = "Here";
        System.out.println(my2test(()->s));

        //比如通过Supplire函数式接口来生成Student对象并去拿属性
        //my2test(()->new Student)
        //System.out.println(sup.get().getName())

        //3.Function,相当于实现某种功能,apply应用到你的输入里面,如函数一样,输入->输出
        // Function<Integer, Integer>,代表输入为整数,返回得结果也是整数
        //如果想把接受一些输入参数并将对输入参数处理过后的结果返回的功能封装到一个方法内,
        // Function接口是一个不错的选择。
        System.out.println(my3test(12,integer -> integer*100));

        //4.Predicate,判断
        String[] s4 = {"这里","那里","哪里","这些"};
        ArrayList<String> list = my4test(s4, ts -> ts.contains("里"));
        System.out.println(list);

    }

    //1.Consumer
    public static void my1test(Integer i ,Consumer<Integer> con){
        con.accept(i);
    }

    //2.Supplier
    public static String my2test(Supplier<String> sup){
        return sup.get();
    }

    //3.Function
    public static Integer my3test(Integer i,Function<Integer,Integer> fun){
        Integer apply = fun.apply(i);
        return apply;
    }

    //4.Predicate
    public static ArrayList<String> my4test(String[] s, Predicate<String> pre){
        ArrayList<String> strings = new ArrayList<>();
        for(String s4:s){
                boolean test = pre.test(s4);
                if(test){
                    strings.add(s4);
                }
        }
        return strings;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值