Java Lambda表达式

2016-05-04  本文已影响376人  Sivin

标签(空格分隔):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);
        }
    }

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

上一篇下一篇

猜你喜欢

热点阅读