Java 8中比較大的改變就是引入了Lambda 表達(dá)式和Stream API凸克,這使得Java可以進(jìn)行函數(shù)式編程(functional programming)议蟆。
1. 什么是函數(shù)式編程
函數(shù)式編程和面向?qū)ο缶幊獭⒚嫦蜻^程編程一樣萎战,都是一種如何編程的方法論咐容,它主要的思想是函數(shù)是“第一等公民”,和其他數(shù)據(jù)類型一樣蚂维,可以被賦值和傳遞戳粒。函數(shù)式編程具有代碼簡潔,易于理解虫啥,易于"并發(fā)編程"等優(yōu)點(diǎn)蔚约。關(guān)于它的簡單介紹,可以參見函數(shù)式編程初探涂籽。
2. 什么是Lambda 表達(dá)式
An expression with parameter variables has been called a lambda expression. --- From Core Java Volume I--Fundamentals (10th Edition)
從上面的定義可以知道苹祟,帶有參數(shù)的表達(dá)式就是lambda 表達(dá)式。例如(String first, String second) -> first.length() - second.length()
就是一個(gè)lambda 表達(dá)式又活。下面我們介紹Java中的lambda 表達(dá)式苔咪。
2.1 問題
public interface ActionListener {
void actionPerformed(ActionEvent e);
}
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ui.dazzle(e.getModifiers());
}
});
上面的代碼使用了匿名類,但匿名類具有冗余的語法柳骄,不夠簡潔团赏,存在“高度問題”。能不能讓代碼更加簡單易讀耐薯?
2.2 解決辦法
通過觀察我們發(fā)現(xiàn)舔清,ActionListener只有一個(gè)抽象方法丝里,我們把只有一個(gè)抽象方法的接口叫做函數(shù)式接口(functional interface),這時(shí)你就可以使用Lambda 表達(dá)式体谒。因而我們可以把代碼簡化為:
button.addActionListener(e -> ui.dazzle(e.getModifiers()));
代碼看起來簡潔多了杯聚。你會發(fā)現(xiàn)Lambda 表達(dá)式并不是很玄的東西,不過是讓代碼看起來更加簡潔的語法糖而已抒痒。
2.3 方法引用(method reference)
有時(shí)幌绍,已經(jīng)有一個(gè)方法做了你期望做的事,這時(shí)我們可以用另一個(gè)語法來進(jìn)一步簡化代碼故响。
// 使用范例
object::instanceMethod
Class::staticMethod
Class::instanceMethod
Timer t = new Timer(1000, event -> System.out.println(event));
Timer t = new Timer(1000, System.out::println);
上面兩種寫法是同等的傀广。System.out::println
是方法引用,等同于lambda表達(dá)式x -> System.out.println(x)
彩届。
另一個(gè)例子:String::compareToIgnoreCase
等價(jià)于(x, y) -> x.compareToIgnoreCase(y)
3. Stream API
為了能夠進(jìn)行函數(shù)式編程伪冰,光有Lambda 表達(dá)式這個(gè)語法糖是不行的,因而Java 8 又提供了Stream API樟蠕,這是一個(gè)非常重大的更新贮聂,可以用函數(shù)式編程的思想方便地實(shí)現(xiàn)對集合(collections)的各種操作。掌握Stream API需要不斷實(shí)踐寨辩,可以網(wǎng)上查閱這些API的用法吓懈,本文對此不再展開,下面是一些例子捣染。
shapes.stream()
.filter(s -> s.getColor() == BLUE)
.forEach(s -> s.setColor(RED));
List<Shape> blue = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.collect(Collectors.toList());
Set<Box> hasBlueShape = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.map(s -> s.getContainingBox())
.collect(Collectors.toSet());
int sum = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.mapToInt(s -> s.getWeight())
.sum();
寫在最后
技術(shù)的核心思想一般都是簡單和通俗易懂的骄瓣,別被它花哨的名詞唬住了,互聯(lián)網(wǎng)擅長制造概念耍攘。當(dāng)然由于水平有限榕栏,如果有什么不對的地方,也歡迎大家指正蕾各。
Reference:
1.Core Java Volume I--Fundamentals (10th Edition) Cay S. Horstmann
2.http://www.cnblogs.com/figure9/p/java-8-lambdas-insideout-language-features.html
3.http://ju.outofmemory.cn/entry/104364