乐趣区

关于java:lambda表达式

介绍:

Lambda 表达式,也可称为闭包,它是推动 Java 8 公布的最重要新个性。
Lambda 容许把函数作为一个办法的参数(函数作为参数传递进办法中)。
应用 Lambda 表达式能够使代码变的更加简洁紧凑。

语法:

(parameters) -> expression
或
(parameters) ->{statements;}

个性:

  • 可选类型申明:不须要申明参数类型,编译器能够对立辨认参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数须要定义圆括号。
  • 可选的大括号:如果主体蕴含了一个语句,就不须要应用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会主动返回值,大括号须要指定明表达式返回了一个数值。

实例:

package com.cy;
import org.omg.Messaging.SyncScopeHelper;
import java.sql.SQLOutput;
public class lambdatest {
    interface MathOperation{int operation(int a,int b);
    }
    interface GreetingService{void sayMessage(String name);
    }
    private int operation(int a,int b,MathOperation mathOperation){return mathOperation.operation(a, b);
    }
    public static void main(String[] args) {
        // 类型申明
 MathOperation addtion=(int a,int b)->a+b;
        // 一般用法
 class Addtest implements MathOperation{
            @Override
 public int operation(int a, int b) {return a+b;}
        }
        // 不必类型申明
 MathOperation subtraction=(a,b)->a-b;
        // 大括号中的返回语句
 MathOperation multiplication=(a,b)->{return a*b;};
        // 没有大括号及返回语句
 MathOperation division=(a,b)->a/b;
        System.out.println("10+5="+new Addtest().operation(10, 5));
        System.out.println("10+5="+new lambdatest().operation(10, 5, addtion));
        System.out.println("10 - 5 =" + new lambdatest().operation(10, 5, subtraction));
        System.out.println("10 x 5 =" + new lambdatest().operation(10, 5, multiplication));
        System.out.println("10 / 5 =" + new lambdatest().operation(10, 5, division));
        // 不必括号
 GreetingService greetingService=message->
                System.out.println(message);
        greetingService.sayMessage("我是 lambda 表达式");
    }
}

后果:

"C:\Program Files\Java\jdk1.8.0_161\bin\java.exe" "-javaagent:E:\IntelliJ IDEA\lib\idea_rt.jar=61573:E:\IntelliJ IDEA\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_161\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_161\jre\lib\rt.jar;E:\ideaprogectworkspace\GitIII2012\out\production\01java" com.cy.lambdatest
10+5=15
10+5=15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
我是 lambda 表达式

留神点:

Lambda 表达式次要用来定义行内执行的办法类型接口,例如,一个简略办法接口
Lambda 表达式免去了应用匿名办法的麻烦,并且给予 Java 简略然而弱小的函数化的编程能力

变量作用域:

lambda 表达式只能援用标记了 final 的外层局部变量,这就是说不能在 lambda 外部批改定义在域外的局部变量,否则会编译谬误
咱们也能够间接在 lambda 表达式中拜访外层的局部变量
lambda 表达式的局部变量能够不必申明为 final,然而必须不可被前面的代码批改(即隐性的具备 final 的语义)
在 Lambda 表达式当中不容许申明一个与局部变量同名的参数或者局部变量

退出移动版