如上图所示,绿色框中就是Lambda表达式,是能够执行的代码块。Lambda表达式是不少编程语言的特征,好比Lisp, Python, Scala等。
可是对于java,在8之后才支持这种写法。在此以前,若是想执行一个代码块,咱们须要新建一个对象,并传递这个对象,好比使用策略模式。java 8之后,能够把某个功能视为方法参数,并传递一个代码块。
对于java 8来讲,Lambda表达式的凭借着自身的强大,而备受关注。
在本文中,我将简单地介绍下函数式编程在java 8中的运用。这是java 8 lambda系列的一部分。java
下面将介绍如何使用 comparator 对自定义数组的排序。express
public class Dog { String name; int height; int weight; public Dog(String n, int s, int w) { this.name = n; this.height = s; this.weight = w; } public String toString() { return getName() + ": size=" + getHeight() + " weight=" + getWeight() + " \n"; } //setters and getters ... }
Arrays.sort(...)
,然而此方法第二个参数是一个比较器(comparator,下同),因此须要构造一个比较器,以下是一个利用策略模式的经典例子。import java.util.Arrays; import java.util.Comparator; import java.util.stream.Stream; public class ArraysSort { public static void main(String[] args) { Dog d1 = new Dog("Max", 2, 50); Dog d2 = new Dog("Rocky", 1, 30); Dog d3 = new Dog("Bear", 3, 40); Dog[] dogArray = { d1, d2, d3 }; printDogs(dogArray); Arrays.sort(dogArray, new Comparator<Dog>() { @Override public int compare(Dog o1, Dog o2) { return o1.getWeight() - o2.getWeight(); } }); printDogs(dogArray); } public static void printDogs(Dog[] dogs) { System.out.println("--Dog List--"); for (Dog d : dogs) System.out.print(d); System.out.println(); } }
Arrays.sort(dogArray, (Dog m, Dog n) -> m.getWeight() - n.getWeight()); printDogs(dogArray);
(Dog m, Dog n) -> Integer.compare(m.getWeight(), n.getWeight())
就是Lambda表达式。它被偷偷地转换成了比较器对象。咱们能够暂时把lambda表达式简单地认为是一个方法。至于lambda表达式如何转成函数式接口是一个复杂的故事。编程
语法包含一下几点:数组
(Dog m, Dog n)
->
- Integer.compare(m.getWeight(), n.getWeight())
固然了,咱们也能使用其余不一样的方式去写lambda表达式的。编程语言
为何在java 8中,lambda表达式这么强大?Stream API起了很大做用。(注:stream不翻译)在java 8中,stream是支持顺序和并行聚合操做的元素序列。
经过使用streams,能够简单地经过一块代码去筛选,并将筛选功能应用于stream中的每个元素。
对于上文的狗子排序,也经过stream实现,以下:ide
import java.util.stream.Stream; public class Java8WhyLambda { public static void main(String[] args) { // create an array of dogs Dog d1 = new Dog("Max", 2, 50); Dog d2 = new Dog("Rocky", 1, 30); Dog d3 = new Dog("Bear", 3, 40); Dog[] dogArray = { d1, d2, d3 }; // use stream to sort Stream<Dog> dogStream = Stream.of(dogArray); Stream<Dog> sortedDogStream = dogStream.sorted((Dog m, Dog n) -> Integer.compare(m.getHeight(), n.getHeight())); sortedDogStream.forEach(d -> System.out.print(d)); } }
原文地址: Why do we need Lambda in Java?函数式编程