转载文献
https://blog.csdn.net/bitcarmanlee/article/details/70195403
本人最讨厌使用lamda表达式,没有之一。但是,无奈大家智商都太高,一个个用的贼6。所以也被迫来学习一下。
一些lambda表达式:
(int x, int y) -> x + y //接收两个参数,返回他们的和。
() -> 42 //不接收任何参数,返回42
(String s) -> { System.out.println(s); } //接收一个字符串参数,打印
如上所示,lamda表达式实质上是一个匿名函数。
替代内部匿名类
public static void main(String[] args){
new Thread(new Runnable() {
public void run() {
System.out.println("begin");
}
}).start();
}
有了lambda表达式,就可以简单写为
public static void main(String[] args){
new Thread(()->{System.out.println("begin");}//可以进一步简化为new Thread(()->System.out.println("begin")
).start();
}
我们自然可以问,如果接口中有多个需要实现的方法,还能使用lamda表达式吗?很遗憾,这时候java会报找到多个非覆盖方法。
对集合进行迭代(结合foreach)
public static void main(String[] args){
List<String> languages = Arrays.asList("java","scala","python");
languages.forEach(x->System.out.println(x));
}
map,reduce,filter
cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
System.out.println(cost.stream().reduce((sum,x)->sum+x).get());
System.out.println(cost.stream().filter(x -> x > 25.0).collect(Collectors.toList()));
实现伪函数式编程。
在JAVA 8 里,函数仍然不是一个对象,不过,你可以把他转变为一个对象。这就是Predicate接口。
public static void main(String[] args){
List<String> languages = Arrays.asList("Java","Python","scala","Shell","R");
System.out.println("Language starts with J: ");
filterTest(languages,x -> x.startsWith("J"));
}
public static void filterTest(List<String> languages, Predicate<String> condition) {
languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " "));
}
最后总结,还是不喜欢。