【Java】Java8新特性Lambda表达式和Stream API

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

猜你喜欢

转载自blog.csdn.net/shimadear/article/details/87995097