恰好今天看到了lambda表达式,学习了一下基本用法,因为上午就是翻开几篇博客看了看,怕本身忘了,因此仍是经过博客的方式记录下。语法确实简洁高效,之后也会在代码里慢慢转变多使用lambda表达式。
想在项目中使用lambda表达式,那么必须在build.gradle文件中加入以下代码:php
defaultConfig {
...//省略
jackOptions {
enabled true
}
}
这样才可以在项目中使用lambda表达式,不过lambda表达式可能会与一些注解框架冲突,具体解决方法自行百度下就知道了。java
对匿名内部类的简写android
对于经常使用的匿名内部类,咱们知道很简单,可是在代码上老是感受很长,那么经过lambda表达式能够对着一块的内容进行简写,从而使代码着一块看起来更加简洁高效。例如一般建立一个新的线程:web
//普通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()方法里是没有参数的,因此能够直接用()来表示,->后的内容表示方法内的操做。也能够直接用::操做符直接进行该操做。redux
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表达式语法的支持。框架
//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);
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 + " ");
}
});
运行结果以下:
ide
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));
运行结果以下:
svg
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);
结果以下:
由于也就看了大概几个小时,因此总结的也不那么充分,参考了别人的博客不过本身也有所有敲一遍加深印象,这篇就是留做加深印象防止本身忘记的,感受平时遇到一些小知识均可以写写博客记录如下,之后就算忘了再看一遍本身总结过的内容也很容易拿起来~