本篇基于Java8演示工作中接觸的Lambda表達式用法役首。
描述一個代碼場景敷鸦,先展示之前的一般寫法提前,然后再用Lambda表達式寫一遍武福。
0.1 Java8下載
JDK8下載
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
0.2 代碼場景1
有一組雙十一來自各個渠道的銷售量數(shù)據(jù)集合噩翠,
現(xiàn)在為了在報表上顯示烹俗,需要把數(shù)據(jù)按銷售量從高到底顯示蛤袒。
package com.lambda;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class TestLambda {
public static void main(String[] args) {
List<Sales> salesList = new ArrayList<>();
salesList.add(new Sales("天貓", 1000));
salesList.add(new Sales("京東", 8000));
salesList.add(new Sales("亞馬遜", 200));
salesList.add(new Sales("大潤發(fā)", 600));
salesList.add(new Sales("歐尚", 800));
//想達到的目的:獲取銷量從高到低的渠道名稱集合:
//1.京東 8000
// 2.天貓 1000
// 3.歐尚 800
// 4.大潤發(fā) 600
// 5.亞馬遜 200
//1. 傳統(tǒng)方法
Collections.sort(salesList, saleCountComparator);
for(Sales s : salesList) {
System.out.println(s.getChannelName()+" "+s.getSaleCount());
}
//2. lambda方法(獲取排序后的對象集合)
List<Sales> list2 = salesList.stream()
.sorted((o1,o2) -> {
return o2.getSaleCount() - o1.getSaleCount();
})
.collect(Collectors.toList());
for(Sales s : list2) {
System.out.println(s.getChannelName()+" "+s.getSaleCount());
}
//3. lambda方法(獲取排序后的渠道名稱集合)
List<String> list3 = salesList.stream()
.sorted((o1,o2) -> {
return o2.getSaleCount() - o1.getSaleCount();
})
//map:一對一轉(zhuǎn)換 輸入一個對象(Sales) 轉(zhuǎn)換為 一個對應(yīng)的渠道名稱(String)
.map(Sales::getChannelName)
.collect(Collectors.toList());
for(String s : list3) {
System.out.println(s);
}
}
public static Comparator saleCountComparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//o2在前鸟蜡,降序排列
return ((Sales)o2).getSaleCount() - ((Sales)o1).getSaleCount();
}
};
}
class Sales {
private String channelName;
private Integer saleCount;
public Sales(String channelName, Integer saleCount) {
this.channelName = channelName;
this.saleCount = saleCount;
}
public String getChannelName() {
return channelName;
}
public void setChannelName(String channelName) {
this.channelName = channelName;
}
public Integer getSaleCount() {
return saleCount;
}
public void setSaleCount(Integer saleCount) {
this.saleCount = saleCount;
}
}
0.3 代碼說明
以上代碼的關(guān)鍵是lambda寫法的stream乘粒、sorted豌注、map
- stream
它和以往文件等輸入輸出流的stream完全兩個概念,
它能夠?qū)蠈ο筮M行各種串行或并發(fā)聚集操作灯萍,
響應(yīng)了現(xiàn)在多核處理器的需求轧铁。 - sorted
sorted函數(shù)需要傳入一個實現(xiàn)Comparator函數(shù)式接口的對象,
該接口的抽象方法compare接收兩個參數(shù)并返回一個整型值旦棉,
作用就是排序齿风,因為做了精簡,所以代碼上比傳統(tǒng)的精簡很多:
.sorted((o1,o2) -> o2.getSaleCount() - o1.getSaleCount())
以上是精簡的寫法绑洛,但是我個人習(xí)慣加上{}救斑,可讀性可能會好些:
.sorted((o1,o2) -> {
return o2.getSaleCount() - o1.getSaleCount();
})
- map
map函數(shù)需要傳入一個實現(xiàn)Function函數(shù)式接口的對象,
該接口的抽象方法apply接收一個參數(shù)并返回一個值真屯,
可以理解為映射關(guān)系脸候,上面的代碼就是將每一個Sales對象映射為一個channelName的String對象
.map(Sales::getChannelName)
(注意語法,中間是2個冒號绑蔫,類似C++的方法調(diào)用)
寫本文僅僅是為了演示Lambda表達式的常用寫法运沦,至于可讀性、可維護性配深、性能高低等方面携添,大家根據(jù)實際情況去判斷吧。
由于作者水平有限篓叶,難免出現(xiàn)紕漏薪寓,如有問題請幫忙指正,謝謝澜共!