Lambda表达式是可以传递执行的代码块。它是某些编程语言(例如Lisp,Python,Scala等)的通用功能。但是在Java 8之前,我们无法在Java中做到这一点。如果要执行代码块,则需要创建一个对象并将其传递给对象,例如使用策略设计模式。从Java 8开始,lambda表达式使我们能够将功能视为方法参数并传递代码块。Java 8中的Lambda表达式非常强大,因此非常引人注目。在本文中,我将使用一个简单的示例来介绍Java 8中的函数式编程。这是Java 8 lambdas系列的一部分。
1. Java 8之前的排序
下面的示例演示如何使用比较器对自定义对象的数组进行排序。
这是需要分类的狗的类。
publicclassDog {
String name;
intheight;
intweight;
publicDog(String n, int s, int w) {
this.name = n;
this.height = s;
this.weight = w;
}
publicString toString() {
returngetName() + ": size=" + getHeight() + " weight=" + getWeight()
+ " \n";
//setters and getters ...}
要对一组狗进行排序,可以使用Arrays.sort(...)。第二个参数是比较器。因此,我们需要定义一个比较器。这是策略模式的典型示例。
importjava.util.Arrays;import java.util.Comparator;import java.util.stream.Stream;
publicclassArraysSort {
publicstaticvoidmain(String[] args) {
Dog d1 = newDog("Max", 2, 50);
Dog d2 = newDog("Rocky", 1, 30);
Dog d3 = newDog("Bear", 3, 40);
Dog[] dogArray = { d1, d2, d3 };
printDogs(dogArray);
Arrays.sort(dogArray, newComparator() {
@Override
publicintcompare(Dog o1, Dog o2) {
returno1.getWeight() - o2.getWeight();
});
publicstaticvoidprintDogs(Dog[] dogs) {
System.out.println("--Dog List--");
for(Dog d : dogs)
System.out.print(d);
System.out.println();
}}
2.使用Java 8 Lambdas表达式排序
在Java 8中,我们可以在一行简单的代码中进行排序,如下所示:
Arrays.sort(dogArray, (Dog m, Dog n) -> m.getWeight() - n.getWeight());
(Dog m, Dog n) -> Integer.compare(m.getWeight(), n.getWeight())是lambda表达式。它被转换为幕后的Comparator对象。现在,让我们简单地将lambda表达式视为一个函数。如何将lambda表达式转换为功能接口的对象是一个更为复杂的故事。
3. Lambda表达式的语法
lambda表达式的语法包括以下内容:
1. 用括号括起来的形式参数的逗号分隔列表。在这种情况下(Dog m, Dog n)
2. 箭头标记 ->
3. 主体,由单个表达式或语句块组成。在这种情况下,它是一个单一表达式-Integer.compare(m.getWeight(), n.getWeight())
我们还可以用其他不同的方式编写lambda表达式。
4.Stream API
当我们说明为什么函数式编程在Java 8中如此强大时,应强调Stream API。Java 8中的流是支持顺序和并行聚合操作的一系列元素。通过使用流,我们可以简单地将代码块传递给流,并将函数应用于流中的每个元素。
为了对上面的dog数组进行排序,我们还可以利用Stream API:
importjava.util.stream.Stream;
publicclassJava8WhyLambda {
// create an array of dogs
// use stream to sort
Stream dogStream = Stream.of(dogArray);
Stream sortedDogStream = dogStream.sorted((Dog m, Dog n) -> Integer.compare(m.getHeight(), n.getHeight()));
sortedDogStream.forEach(d -> System.out.print(d));
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。