Lambda表达式
Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样有时可读性更好,表达更清晰。最开始接触是在C#中,什么匿名方法,委托…下面介绍其在Java中的运用。
语法书写
Java 中的 Lambda 表达式通常使用 (argument) -(body) 语法书写
(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }
例子
(int a, int b) -> { return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> 42
() -> { return 3.1415 };
表达式的结构
- 一个 Lambda 表达式可以有零个或多个参数
- 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
- 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
- 空圆括号代表参数集为空。例如:() -> 42
- 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
- Lambda 表达式的主体可包含零条或多条语句
- 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
- 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空
使用情景
代替匿名内部类
new Thread(new Runnable() { @Override public void run() { System.out.println("before JAVA8"); } }).start(); new Thread(()-> System.out.println("in Java8") ).start();
对列表进行迭代
// Java 8之前: List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); for (String feature : features) { System.out.println(feature); } // Java 8之后: List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); features.forEach(n -> System.out.println(n)); // 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示, features.forEach(System.out::println);
对事件的处理
// Java 8之前: JButton show = new JButton("Show"); show.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Event handling without lambda expression is boring"); } }); // Java 8方式: show.addActionListener((e) -> { System.out.println("Light, Camera, Action !! Lambda expressions Rocks"); });
更多使用场景请移步参考资料
在Android中使用
- 配置AndroidStudio支持Java8
修改build.gradle
- 使用
如图为按钮添加一个监听事件
在灰色的代码上面按alt+Enter会出现自动替换成Lamdba的选项,可见官方是推荐使用Lamdba表达式的。
现在就可以随意的玩耍啦~
参考资料
本文地址:http://blog.csdn.net/prodigalwang/article/details/74741787