美文网首页
Java Lambda表达式

Java Lambda表达式

作者: Sivin | 来源:发表于2016-05-04 00:22 被阅读376次

    标签(空格分隔):java


    Lambda表达式是java8的重要更新,Lambda表达式的目标类型必须是函数式接口

    什么样的接口符合函数式接口呢?

    通俗直观的可这样认为:一个接口中只含有一个抽象方法。

    注:函数式接口可以包含多个默认方法,类方法,但只能声明一个抽象方法。
    

    如何使用呢?
    两个条件:

    1.Lambda表达式的目标类型必须是明确的函数式接口
    2.lambda表达式只能为函数式接口创建对象。(只能为只有一个抽象方法的接口创建对象)
    

    Lambda表达式时为了让我们只关注方法的形参方法体,不用关注方法名和接口或类名,当然如果这个方法的返回值为void的话,也不用关注返回值,对于有返回值的函数式接口,如果方法体一条语句就返回,同时也可以不用带方法体,直接在->后面跟上表达式结果就会默认认为是返回值;

    //常规写法:
    iter.forEachRemaining(new Consumer<Student>() {
                @Override
                public void accept(Student t) {
                    System.out.println(t.getName());
                }
            });
    
    //Lambda式写法:
    iter.forEachRemaining((Student studnet)->{
       System.out.println(studnet.getName()));
    }
    //当只有一个类型的形参或者一个语句时,我们可以省略形参类型和方法体
    //如:
    iter.forEachRemaining(t->System.out.println(t.getName()+"第一个"));
    

    什么,一个例子不够?,那再来一个:

    //常规写法:
    pr.precess(target,new Command(){
                public int process(int[] temp){
                    int sum =0;
                    for(int t:temp){
                        sum +=t;
                    }
                    return sum;
                }
            });
            
    //Lambda式写法:
            pr.process(tar,(int[] temp)->{
                int sum =0;
                for(int t:temp){
                    sum +=t;
                }
                return sum;
            });
    

    如果方法体中的表达式只有一个,而且表达式的值就是返回值,甚至可以省略return语句

    pr.test((a,b)->a+b);
    

    是不是十分简洁呢?

    下面说一下注意事项:
    为了保证Lambda表达式的目标类型是一个明确的函数式接口,可以有下面三种常见方式:

    1.将Lambda赋值给函数式接口类型的变量;
    2.将Lambda表达式作为函数式类型接口的某个方法传递给某个方法。
    3.使用函数式接口对Lambda式进行强制类型转换。
    
        Object obj = (Runnable)()->{
            for(int i =0 ; i< 100 ; i++){
               System.out.println(i);
            }
        }
    

    当然简洁的同时,也是一把双刃剑,同时也增加了代码理解的复杂度,使用还需根据需要。

    相关文章

      网友评论

          本文标题:Java Lambda表达式

          本文链接:https://www.haomeiwen.com/subject/lljrrttx.html