理解JAVA 8的Lambda表达式

来源:互联网 发布:11年总决赛司机数据 编辑:程序博客网 时间:2024/05/03 20:59

JAVA 8 新特性, Lambda表达式, 函数式编程,听着很高大上的感觉,今天花了一点时间学习了一下,把要点记录下来。

        Lambda表达式总的来说还是个语法糖,本质可以理解成对匿名内部类的简写,而且只能用于只有一个抽象方法的匿名内部类。看下面的代码:

        首先定义一个接口:

1
2
3
4
5
@FunctionalInterface
publicinterfaceCalculate1 {
 
    publicintgetValue();
}

        注意这个接口有一个注解@FunctionalInterface,这个注解没什么卵用,就是个编译检查,保证你的接口里面有且只有一个抽象函数,否则就会报错来提醒你

        那么针对这个接口看看这分别用匿名内部类和Lambda表达式的方式来实现,看这段代码:

1
2
3
4
5
6
7
8
Calculate1 calculate1 = newCalculate1() {
    @Override
    publicintgetValue() {
        return0;
    }
};
 
calculate1 = () -> 0;

        上面是用匿名内部类实现,下面使用Lambda表达式实现,是不是代码简洁了很多,这是最简洁的方式,没有入参,所以 "->"的左边的圆括号里什么都没有,"->"的右边没有花括号,只有一个0,就等同于{return 0;}

         下面的代码再演示有参数的情况,先看接口的代码:

1
2
3
4
5
@FunctionalInterface
publicinterfaceCalculate2 {
 
    publicintgetValue(inta);
}

         然后是Lambda表达式来实现:

1
Calculate2 calculate2 = (a) -> a * a;

         注意到Lambda表达式的参数是不需要定义类型的,因为我们在接口中已经定义了,编译器会自己判断。

         最后来个完整版的,既有参数,接口实现也不止一句。接口类:

1
2
3
4
@FunctionalInterface
publicinterfaceCalculate3 {
    publicintgetValue(inta,intb);
}
    Lambda实现:
1
2
3
4
Calculate3 calculate3 = (a, b) -> {
    intaa = a * a;
    returnaa * b;
};

         说了这么多,这个语法糖最有用的地方当然是Java本身那些函数式接口了,就是那些只有一个方法的接口,最容易想到的就是Runnable,看下这个类在Java 8里面的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@FunctionalInterface
publicinterfaceRunnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    publicabstractvoidrun();
}

         已经被加上@FunctionalInterface注解了,用Lambda表达式实现一个:

1
2
3
Runnable run = () -> {
    System.out.println("Lambda Runnable");
};

          还有个比较好用的就是遍历List:

1
2
3
4
5
List<String> testList = newArrayList<>();
testList.add("a");
testList.add("b");
testList.add("c");
testList.forEach(each -> System.out.println(each));

         这里的each表示List里面的每个元素。

         还有一种Lambda,就是"::",这个个人认为没太大价值了,语义表达得不好,规则也不太简单。

1
2
3
4
5
List<String> testList = newArrayList<>();
testList.add("a");
testList.add("b");
testList.add("c");
testList.forEach(System.out::println);

         功能跟前一段代码一样,第一眼看过去是不是更晕,喜欢写这种代码的任多半有怪癖

         这就是对Lambda表达式的学习。

0 0
原创粉丝点击