函数式接口与Lambda表达式

函数式接口:接口中只有一个抽象方法的接口,称为函数式接口

Java8中内置的核心的四大函数式接口。

一 、消费型接口

Consumer<T>     接收一个 T 类型
    void accept(T t);

    public void eat(double money,Consumer<Double> con){
        con.accept(money);
    }

    @Test
    public void consumer(){
        eat(100,m-> System.out.println("吃饭消费了"+m+"元"));
    }

 输出结果为


二 、供给型接口  

Supplier<T>     返回T类型对象
  T  get();

   /**
     * 生成指定数量的整数并存入到集合
     * @param num
     * @param sup
     * @return
     */
    public List<Integer> getNumList(int num, Supplier<Integer> sup){
        List<Integer> list=new ArrayList<>();

        for (int i = 0; i < num; i++) {
            Integer n=sup.get();
            list.add(n);
        }
        return list;
    }

    @Test
    public void supplier(){
        List<Integer> numList=getNumList(10,()->(int)(Math.random()*100));
        for (Integer num:numList){
            System.out.println(num);
        }
    }

 输出结果


三 、函数型接口

Function<T, R>  由T类型对象转成R类型对象
    R apply(T t);

   //处理字符串
    public String strHandler(String str, Function<String,String> fun){
        //允许调用某一个对象的一个方法,并且用指定的一个对象替换当前的对象.
        return fun.apply(str);
    }

    @Test
    public void function(){
        String newStr=strHandler("\t\t Function",str ->str.trim());
        System.out.println(newStr);
        String subStr=strHandler("Function",s -> s.substring(2,5));
        System.out.println(subStr);
    }

输出结果


四 、断言型接口

Predicate<T>    条件判断
    boolean test(T t);

/**
     * 将满足条件的字符串放入集合中
     * @param list
     * @param pre
     * @return
     */
    public List<String> filterStr(List<String> list, Predicate<String> pre){
        List<String> stringList=new ArrayList<>();
        for (String str:stringList){
            if (pre.test(str)){
                stringList.add(str);
            }
        }
        return stringList;
    }

    @Test
    public void predicate(){
        List<String> list=Arrays.asList("Hello","predicate","lambda","zxf","yh");
        List<String> stringList=filterStr(list,s -> s.length()>3);
        for (String str:stringList){
            System.out.println(str);
        }
    }

输出结果:


Lambda表达式也可称为闭包(定义在一个函数内部的函数)

它允许把函数作为另一个方法的参数(函数作为参数传递进方法中)

同时,lambda只支持函数式接口,即只有一个抽象方法的接口

可以使用注解@FunctionalInterface 修饰,可以检查是否是函数式接口。

Lambda 表达式的参数列表中参数的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”


基本语法

(参数) -> (表达式)

(参数) -> (语句)

-> : 箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表;
右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体;


语法举例

一 、无参无返回值

 @Test
    public void lambda(){
        Runnable runnable=new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello Lambda!!!");
            }
        };
        runnable.run();
        System.out.println("-----------------------------");
        Runnable runnable1=()-> System.out.println("Hello Lambda!!!");
        runnable1.run();
    }

输出结果为


二 、有一个参,无返回值(只有一个参数是lambda表达式的参数X的小括号可以省略不写)

 @Test
    public void lambda2(){
        Consumer<String> con=x-> System.out.println(x);
        con.accept("有一个参,无返回值");
    }

输出结果为


三 、有两个以上的参数,有返回值,并且 Lambda 体中有多条语句

    @Test
    public void lambda3(){
        Comparator<Integer> comparator=(x,y)->{
            System.out.println("111");
            return Integer.compare(x,y);
        };
    }

四 、若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写

   @Test
    public void lambda4(){
        Comparator<Integer> comparator=(x,y)-> Integer.compare(x,y);
    }

参考地址:Mason啊 - 简书

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值