Java中的lamda表达式---更加高效简洁的表达方式
来源:互联网 发布:全景天窗 知乎 编辑:程序博客网 时间:2024/05/29 07:10
前言
刚好今天看到了lambda表达式,学习了一下基本用法,由于上午就是翻开几篇博客看了看,怕自己忘了,所以还是通过博客的方式记录下。语法确实简洁高效,以后也会在代码里慢慢转变多使用lambda表达式。
前提
想在项目中使用lambda表达式,那么必须在build.gradle文件中加入如下代码:
defaultConfig { ...//省略 jackOptions { enabled true } }
这样才能够在项目中使用lambda表达式,不过lambda表达式可能会与一些注解框架冲突,具体解决方法自行百度下就知道了。
用法
对匿名内部类的简写
对于常用的匿名内部类,我们知道很简单,但是在代码上总是感觉很长,那么通过lambda表达式可以对着一块的内容进行简写,从而使代码着一块看起来更加简洁高效。例如通常创建一个新的线程:
//普通java代码 new Thread(new Runnable() { @Override public void run() { System.out.println("开启了一个新的线程~"); } }).start(); //lambda代码 new Thread(() -> System.out.println("开启了一个新的线程")).start(); //使用::操作符 new Thread(System.out::println).start();
可以看到,创建一个线程,对于同样的操作lambda表达式仅仅用了简单的一行就搞定了,实际上是对于匿名内部对象和方法名的简写。这里的run()方法里是没有参数的,所以可以直接用()来表示,->后的内容表示方法内的操作。也可以直接用::操作符直接进行该操作。
- 对监听的简单写法:
我们在android开发中经常要写监听,其实本质也就是对匿名内部类的简写:
tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { System.out.println("hahaha"); } }); tv.setOnClickListener((l) -> System.out.println("hahaha"));
可以看到,同样的是对匿名内部类的简写,这里因为View.OnclickListener接口内的onClick(View v)方法里有参数view,所以()中我们加入一个参数“l”,java在解析lambda表达式的时候会自动做参数类型分析,这里的l被分析以后自然是View类型的,所以能用lambda表达式的关键也在与语言对lambda表达式语法的支持。
- 使用lambda表达式来进行list的迭代:
我们普通的对list的迭代有几种方法,而对于使用lambda表达式则可以更简单的表达出我们想要迭代的内容:
//for循环遍历 for (int i = 0; i < arrays.size(); i++) { System.out.println(i); } //foreach遍历 for (String array : arrays) { System.out.println(array); } //lambda 表达式 arrays.forEach(array -> System.out.println(array)); //解引用 arrays.forEach(System.out::println);
- 使用lambda表达式和函数式接口Predicate:
List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp"); System.out.println("Languages which starts with J :"); Predicate<String> p = s -> s.startsWith("J"); languages.forEach((language) -> { if (p.test(language)) { System.out.println(language + " "); } });
运行结果如下:
- 函数式接口Predicate的合并
Predicate<String> j = s -> s.endsWith("a"); Predicate<String> j4 = s -> s.length() == 5; //通过合并条件选择 languages.stream().filter(j.and(j4)).forEach((name) -> System.out.println(name));
运行结果如下:
- Java 8中使用lambda表达式的Map和Reduce示例
List<Integer> list = Arrays.asList(100, 200, 300, 400); list.stream().map((cost) -> cost + 0.12 * cost).forEach((cost) -> System.out.println(cost));
这里将每个数加上自己增值0.12倍以后的结果,用map做转换,结果如下:
这里通过redux将转换后的结果进行相加求和:
double money = list.stream().map((cost) -> cost + 0.12 * cost).reduce((sum, cost) -> sum += cost).get(); System.out.println("money==" + money);
结果如下:
结语
因为也就看了大概几个小时,所以总结的也不那么充分,参考了别人的博客不过自己也有全部敲一遍加深印象,这篇就是留作加深印象防止自己忘记的,感觉平时遇到一些小知识都可以写写博客记录以下,以后就算忘了再看一遍自己总结过的内容也很容易拿起来~
- Java中的lamda表达式---更加高效简洁的表达方式
- 让java代码更加的简洁
- Python中的 lamda表达式
- Python中的lamda表达式
- python的lamda表达式
- 让系统盘“瘦身”的方法--使你的系统会更加清爽、简洁、高效!
- Java 目录的表达方式
- lamda (java 8) 表达式
- c++ lamda表达式的注意事项
- lamda表达式的底层原理
- 如何更加高效的学习
- 更加简洁且通用的ViewHolder写法
- lamda表达式
- lamda表达式
- Lamda表达式
- lamda表达式
- lamda表达式
- Java 写类C# Lamda表达式
- 如何快速搭建一个微服务架构?
- 技术分享的好处
- 指针和数组
- reboot流程分析
- 用户管理(二):使用shell脚本批量删除除root用户以外的其它用户
- Java中的lamda表达式---更加高效简洁的表达方式
- 实训第一章
- Mybatis整合spring
- 手游服务端框架之客户端协议组合下发
- Java实训课1
- webkit与Chrome
- VS2010&MFC对话框编程(2)——对话框种类(模态/非模态对话框)
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- linux 下取进程占用 cpu/内存 最高的前10个进程