Lambda表达式是实现支持函数式编程技术的基础。
函数式编程与面向对象编程:函数式编程将程序代码看作数学中的函数,函数本身作为另一个函数参数或返回值,即高阶函数。而面向对象编程按照真实世界客观事物的自然规律进行分析,客观世界中存在什么样的实体,构建的软件系统就存在什么样的实体。
Lambda表达式是一个匿名方法代码块,可以作为表达式,方法参数和方法返回值。Java中的方法必须声明在类或接口中,Lambda表达式所实现的匿名方法是在函数式接口(函数式接口,有且仅有一个抽象方法,Object的public方法除外。)中声明的。
有关Stream API,可以先看看这篇文章:https://www.cnblogs.com/CarpenterLee/p/6545321.html
下面用几个例子来说明Lambda表达式示例:
1.用lambda表达式实现Runnable
使用lambda表达式替换匿名类,实现Runnable接口是匿名类的最好示例。用() -> {}代码块替代了整个匿名类。
package lambda;
public class LambdaDemo {
public static void main(String[] args) {
//Java 8之前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
//Java 8方式:
new Thread(()->System.out.println("In Java8, Lambda expression rocks !!")).start();
}
}
注意:如果Lambda表达式体中只有一条语句,那么可以省略return和大括号。
这个例子向我们展示了Java 8 lambda表达式的语法。
如果你的方法接收两个参数,那么可以写成如下这样:
(int even, int odd) -> even + odd
当然也可以省略参数类型,Lambda表达式可以根据上下文环境推断出参数类型。
如果你的方法不对参数进行修改、重写,只是在控制台打印点东西的话,那么可以这样写:
() -> System.out.println("Hello Lambda Expressions");
2.使用lambda表达式对列表进行迭代
针对集合类,最常见的操作就是进行迭代,并将业务逻辑应用于各个元素,例如处理订单、交易和事件的列表。由于Java是命令式语言,Java 8之前的所有循环代码都是顺序的,即可以对其元素进行并行化处理。如果你想做并行过滤,就需要自己写代码,这并不是那么容易。通过引入lambda表达式和默认方法,将做什么和怎么做的问题分开了,这意味着Java集合现在知道怎样做迭代,并可以在API层面对集合元素进行并行处理。下面的例子里,将介绍如何在使用lambda或不使用lambda表达式的情况下迭代列表。你可以看到列表现在有了一个 forEach() 方法,它可以迭代所有对象,并将你的lambda代码应用在其中。
package lambda;
import java.util.Arrays;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
// Java 8之前:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (Object feature : features) {
System.out.println(feature.toString());
}
System.out.println("使用Java 8后:");
// Java 8之后:
List features2 = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features2.forEach(str -> System.out.println(str));
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
// 看起来像C++的作用域解析运算符
features2.forEach(System.out::println);
}
}
运行结果:
列表迭代的最后一个例子展示了如何在Java 8中使用方法引用(method reference)。Java 8之后加了双冒号“::”运算符,该运算符用于“方法引用”,注意不是调用方法。
更多Java8 lambda表达式示例请查看这篇文章:https://www.cnblogs.com/coprince/p/8692972.html