好炫的Lambda表达式,Java党用起来!(最简易Lambda教程)
2015-08-29 11:02
591 查看
刷微博时偶然看到 Lambda 的 HelloWorld 教程,觉得很酷炫!分享一下!
//之前的写法btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.println("hello lambda"); ... }});//Lambda表达式写法btn.setsetOnClickListener((View v) -> { System.out.println("hello lambda"); ... });
//之前的写法new Thread(new Runnable() { @Override public void run() { System.out.println("hello lambda"); }}).start();//Lambda表达式写法(只有一行内容可以去掉代码块大括号)new Thread(() -> System.out.println("hello lambda")).start();
一个lambda expression由三部分组成:
- 参数:(T args)是这个lambda expression的参数部分,包括参数类型和参数名,可为空,小括号不可缺少
- 箭头:->,不可缺少
- 代码块:就是用”{}”包含着的代码。当代码块内代码只有一行时,花括号可以省略,且代码块内分号省略
如上例子,第二个参数“一定”要为new Comparator<T>(){}类型,那么可以先去掉这第一个“一定”
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, @Override public int compare(Student stu1, Student stu2) { return Integer.compare(stu1.age, stu2.age); } );}
new Comparator<T>(){}里面“一定”要重写compare方法,并且“一定”返回int类型,那么方法名称也可以去掉
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, (Student stu1, Student stu2) { return Integer.compare(stu1.age, stu2.age); } );}
这个时候还是会报错,我们在参数列表和代码块之间加上箭头(->)就构成完整的Lambda表达式就能编译通过了。
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, (Student stu1, Student stu2) -> { return Integer.compare(stu1.age, stu2.age); } );}
如果代码块中只有一行代码的话,可以把大括号去掉,同时return去掉(因为compare方法一定返回int),而且这一行的最后的分号去掉。并且多余的空行可以合并为一行。
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, (Student stu1, Student stu2) -> Integer.compare(stu1.age, stu2.age));}
compare方法的参数列表中的参数类型“一定”是Arrays.sort()方法中第一个参数的类型,所以可以省略,因为JVM能够帮我们推导出来。
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, (stu1, stu2) -> Integer.compare(stu1.age, stu2.age));}
简化完成!现在再来对比一下简化后和简化前的代码,你们感受一下
//对比两个学生的年龄public void sort(Student[] students) { //简化前 Arrays.sort(students, new Comparator<Student>() { @Override public int compare(Student stu1, Student stu2) { return Integer.compare(stu1.age, stu2.age); } }); //简化后 Arrays.sort(students, (stu1, stu2) -> Integer.compare(stu1.age, stu2.age));}
Runnable r = () -> System.out.println("hello lambda");new Thread(r).start();
我是Android党,Java 8以上才支持Lambda表达式,而Android最新只支持Java 7,如果Android中想使用的话,使用gradle-retrolambda插件。
最后还是推荐大家去看视频:《 Lambda 的 HelloWorld 视频教程》
Reference:
《 Lambda 的 HelloWorld 视频教程》
《Java 8的Lambda及其在Android 开发中的应用》
《如何在Android编程中使用Lambda表达式》
效果示例
总体看起来效果就是代码简洁,如下//之前的写法btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.println("hello lambda"); ... }});//Lambda表达式写法btn.setsetOnClickListener((View v) -> { System.out.println("hello lambda"); ... });
//之前的写法new Thread(new Runnable() { @Override public void run() { System.out.println("hello lambda"); }}).start();//Lambda表达式写法(只有一行内容可以去掉代码块大括号)new Thread(() -> System.out.println("hello lambda")).start();
sLambda表达式模板
(T args) -> { //代码块}一个lambda expression由三部分组成:
- 参数:(T args)是这个lambda expression的参数部分,包括参数类型和参数名,可为空,小括号不可缺少
- 箭头:->,不可缺少
- 代码块:就是用”{}”包含着的代码。当代码块内代码只有一行时,花括号可以省略,且代码块内分号省略
原理
Lambda表达式不是新语法,是一种精简的字面写法,其实就是程序员可以把匿名内部类中“一定”要做的工作省略掉,然后由JVM通过推导把简化的表达式还原。分步讲解
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, new Comparator<Student>() { @Override public int compare(Student stu1, Student stu2) { return Integer.compare(stu1.age, stu2.age); } });}如上例子,第二个参数“一定”要为new Comparator<T>(){}类型,那么可以先去掉这第一个“一定”
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, @Override public int compare(Student stu1, Student stu2) { return Integer.compare(stu1.age, stu2.age); } );}
new Comparator<T>(){}里面“一定”要重写compare方法,并且“一定”返回int类型,那么方法名称也可以去掉
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, (Student stu1, Student stu2) { return Integer.compare(stu1.age, stu2.age); } );}
这个时候还是会报错,我们在参数列表和代码块之间加上箭头(->)就构成完整的Lambda表达式就能编译通过了。
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, (Student stu1, Student stu2) -> { return Integer.compare(stu1.age, stu2.age); } );}
如果代码块中只有一行代码的话,可以把大括号去掉,同时return去掉(因为compare方法一定返回int),而且这一行的最后的分号去掉。并且多余的空行可以合并为一行。
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, (Student stu1, Student stu2) -> Integer.compare(stu1.age, stu2.age));}
compare方法的参数列表中的参数类型“一定”是Arrays.sort()方法中第一个参数的类型,所以可以省略,因为JVM能够帮我们推导出来。
//对比两个学生的年龄public void sort(Student[] students) { Arrays.sort(students, (stu1, stu2) -> Integer.compare(stu1.age, stu2.age));}
简化完成!现在再来对比一下简化后和简化前的代码,你们感受一下
//对比两个学生的年龄public void sort(Student[] students) { //简化前 Arrays.sort(students, new Comparator<Student>() { @Override public int compare(Student stu1, Student stu2) { return Integer.compare(stu1.age, stu2.age); } }); //简化后 Arrays.sort(students, (stu1, stu2) -> Integer.compare(stu1.age, stu2.age));}
其他效果
Lambda表达式也可以用于赋值。Runnable r = () -> System.out.println("hello lambda");new Thread(r).start();
Lambda使用限定
简单来说,下载最新的Eclipse就能支持Lambda语法。我是Android党,Java 8以上才支持Lambda表达式,而Android最新只支持Java 7,如果Android中想使用的话,使用gradle-retrolambda插件。
最后还是推荐大家去看视频:《 Lambda 的 HelloWorld 视频教程》
Reference:
《 Lambda 的 HelloWorld 视频教程》
《Java 8的Lambda及其在Android 开发中的应用》
《如何在Android编程中使用Lambda表达式》
相关文章推荐
- Java 的foreach循环
- android windows 32位开发工具 eclipse+sdk23+adt23+ndk+genymotion插件
- Java获取此次请求URL以及服务器根路径的方法
- Java心得24
- java综合(六)hibernate.current_session_context_class配置
- Java中基于Rxtx的串口操作
- Spring-事件体系
- 详解slf4j+logback在java工程中的配置
- Struts2学习笔记(九):Strut2通用标签详解
- java多线程编程底层原理剖析以及volatile原理
- Java加载Class文件的原理机制
- spring-PropertyPlaceholderConfigurer和PropertyOverrideConfigurer
- Java 温故
- 在ubuntu下使用Eclipse搭建Hadoop开发环境《转》
- 从Eclipse到Android Studio——改变了什么
- Java记录 -12- 方法重载与重写
- 如何构建自己的.jar文件
- Leetcode全排列问题Java版
- 汇总常见的JAVA错误
- JAVA生成给定范围内的不重复的随机数的几种方法