赞
踩
java8的新特性就是Lambda表达式,那么,Lambda表达式到底能带来哪些优点。我这里总结一个最最最常见的优点--性能优化。
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。
先看一段常见的程序
- public class MyLambda {
- public static void showLog(int level, String mess) {
- if (level == 1) {
- System.out.println(mess);
- }
- }
-
- public static void main(String[] args) {
- String mess1 = "Hello";
- String mess2 = "java";
-
- showLog(1, mess1 + mess2);
- }
- }
这段程序很简单,但是,会造成性能上的浪费。你看啊,这里调用showLog函数,直接传递1以及mess1和mess2拼接好的字符串传过去,显示Hellojava。但是,如果传递的level是不是1,那么,就不会输出Hellojava,但是,还是会把mess1和mess2拼接好的字符串传递过去。
下来,看一下Lambda表达式写这段程序。
函数式接口IMyLambda
- @FunctionalInterface
- public interface IMyLambda {
- String buildMess();
- }
测试类
- public class MyLambda {
- public static void showLog(int level, IMyLambda mess) {
- if (level == 1) {
- System.out.println(mess.buildMess());
- }
- }
-
- public static void main(String[] args) {
- String mess1 = "Hello";
- String mess2 = "java";
-
- //此处,第二个参数是函数式接口类型,可以写Lambda表达式进行表示
- showLog(1, () -> {
- return mess1 + mess2;
- });
- }
- }

与上面普通方法不同的是:上面的会把拼接字符串mess1 + mess2传给showLog函数;
而使用Lambda表达式,仅仅是把参数传递到showLog方法中,如果第一个参数level是1,才会调用接口IMyLambda中的方法buildMess方法,才会进行字符串的拼接。否则,如果不是1,那么就不会调用接口中的方法,不会进行字符串的拼接。所以,Lambda表达式在一定程度上,优化了程序。
Lambda表达式和匿名内部类很像,比如:
Lambda表达式写法:
- showLog(1, () -> {
- return mess1 + mess2;
- });
匿名内部类写法:
- showLog(1, new IMyLambda() {
- @Override
- public String buildMess() {
- return mess1 + mess2;
- }
- });
但是,Lambda仅仅适用于函数式接口,所以,在参数为函数式接口的方法中,我们可以尽量使用Lambda表达式,不仅书写简单,还能优化性能。比如,最有名的Runnable接口的run()方法了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。