java8 優雅程式設計例項@Lambda表示式和流的使用
1、前言:
使用java8的lambda表示式和流處理方式可以極大的簡化java程式碼,編寫出優雅的java程式碼。
2、基礎
2.1、Lambda表示式
2.1.1、Lambda表示式理解為,簡潔地表示可傳遞的匿名函式的一種方式。它沒有名稱,但它有引數列表、函式主體、返回型別,可能還有一個可以丟擲的異常列表。
2.1.2、Lambda表示式有三個部分,引數列表、箭頭、Lambda主體。
基本語法是:(parameters) -> expression
或(請注意語句的花括號) (parameters) -> { statements; }
2.2、流
2.2.1、流是Java API的新成員,它允許你以宣告性方式處理資料集合(通過查詢語句來表達,而不是臨時編寫一個實現)。就現在來說,你可以把它們看成遍歷資料集的高階迭代器
2.2.2、流與集合
粗略地說,集合與流之間的差異就在於什麼時候進行計算。
集合是一個記憶體中的資料結構,它包含資料結構中目前所有的值——集合中的每個元素都得先算出來才能新增到集合中。(你可以往集合里加東西或者刪東西,但是不管什麼時候,集合中的每個元素都是放在記憶體裡的,元素都得先算出來才能成為集合的一部分。)
相比之下,流則是在概念上固定的資料結構(你不能新增或刪除元素),其元素則是按需計算的。
2.2.2.1 流只能遍歷一次。集合可以遍歷多次。
2.2.2.2 流使用內部迭代。它幫你把迭代做了,還把得到的流值存在了某個地方,你只要給出一個函式說要幹什麼就可以。
集合需要使用者做迭代,稱為外部迭代。(foreach/iterator)
2.2.3、流操作
2.2.3.1、中間操作:
中間操作會返回另一個流,合併起來,在終端操作時一次性全部處理。
例如:filter、map、limit、distinct、
2.2.3.2、終端操作:
終端操作會從流的流水線生成結果(非流的值)。例如:count、forEach、collect
2.2.3.3、使用流
流的使用一般包括三件事:
一個數據源(如集合)來執行一個查詢;
一箇中間操作鏈,形成一條流的流水線;
一個終端操作,執行流水線,並能生成結果
3、程式碼例項
3.1、找出2011年發生的所有交易,並按交易額排序。
Java8以前寫法:
//定義臨時變數
List<Transaction> transactionTempList = new ArrayList<Transaction>();
//先過濾出2011年份發生的交易,存入臨時變數中
for (Transaction transaction : transactionList) {
if(transaction.getTradTime().equals("2011")){
transactionTempList.add(transaction);
}
}
//按交易額排序,實現Comparator介面
Collections.sort(transactionTempList, new Comparator<Transaction>() {
@Override
public int compare(Transaction o1, Transaction o2) {
return String.valueOf((o1.getTranMoney())).compareTo(String.valueOf((o2.getTranMoney())));
}
});
//列印資料
for (Transaction transaction : transactionTempList) {
System.out.println(transaction.toString());
}
Java8寫法16行程式碼變1行
//使用stream處理資料。使用filter過濾2011年的交易記錄。使用sorted排序。
//Transaction::getTranMoney寫法可以簡單理解為呼叫Transaction的getTranMoney方法。
List<Transaction> tranList1 = transactionList.stream().filter(tran -> tran.getTradTime().equals("2011")).sorted(comparing(Transaction::getTranMoney)).collect(toList());
//列印資料
tranList1.stream().forEach(System.out::println);
3.2、交易員都在哪些不同的城市工作過。
Java7寫法:
//定義變數儲存城市
List<String> cityTempList = new ArrayList<String>();
for (Transaction transaction : transactionList) {
String cityTemp = transaction.getTrader().getCity();
if(!cityTempList.contains(cityTemp)){
cityTempList.add(cityTemp);
}
}
//遍歷城市集合
for (String string : cityTempList) {
System.out.println(string);
}
Java8優雅寫法:
//2、交易員都在哪些不同的城市工作過
transactionList.stream().map(tran -> tran.getTrader()).map(trad -> trad.getCity()).distinct().forEach(System.out::println);
3.3、查詢所有來自於成都的交易員,並按姓名排序。
Java7寫法:
List<Transaction> cityTempList = new ArrayList<Transaction>();
for (Transaction transaction : transactionList) {
String cityTemp = transaction.getTrader().getCity();
if(cityTemp.equals("成都")){
cityTempList.add(transaction);
}
}
for (Transaction transaction : cityTempList) {
System.out.println(transaction.getTrader());
}
Java8優雅寫法:
List<Trader> tranList3 = transactionList.stream().map(tran -> tran.getTrader()).filter(trad -> trad.getCity().equals("成都")).sorted(comparing(Trader::getName)).collect(toList());
tranList3.forEach(System.out::println);
3.4、返回所有交易員的姓名字串,按字母順序排序
List<String> tranList4 = transactionList.stream().map(tran -> tran.getTrader()).map(trad -> trad.getName()).distinct().sorted().collect(toList());
3.5、有沒有交易員是在成都工作的
寫法1:
transactionList.stream().map(tran -> tran.getTrader().getCity().equals("成都")).findAny().ifPresent(System.out::println);;
寫法2:
System.out.println(transactionList.stream().anyMatch(transaction -> transaction.getTrader().getCity().equals("成都")));
3.6、列印生活在成都的交易員的所有交易額
System.out.println(transactionList.stream().filter(tranB -> tranB.getTrader().getCity().equals("成都")).map(Transaction::getTranMoney).reduce(Double::sum));
3.7、所有交易中,高的交易額是多少?
System.out.println(transactionList.stream().map(Transaction::getTranMoney).reduce(Double::max));
3.8、找到交易額小的交易 System.out.println(transactionList.stream().map(Transaction::getTranMoney).reduce(Double::min));
擴張:
交易員類Trader
public class Trader {
private String name;
private String city;
/**
含參建構函式
*/
public Trader(String name, String city) {
super();
this.name = name;
this.city = city;
}
/**
重寫tostring方法
*/
@Override
public String toString() {
return "Trader [name=" + name + ", city=" + city + "]";
}
/**
省略get、set方法
*/
}
交易類Transaction。
public class Transaction {
private Trader trader;//交易員
private String tradTime;//交易年份
private double tranMoney;//交易金額
public Transaction(Trader trader, String tradTime, double tranMoney) {
super();
this.trader = trader;
this.tradTime = tradTime;
this.tranMoney = tranMoney;
}
@Override
public String toString() {
return "Transaction [trader=" + trader + ", tradTime=" + tradTime + ", tranMoney=" + tranMoney + "]";
}
}
初始化交易員類
Trader t1 = new Trader("liubei", "成都");
Trader t2 = new Trader("caocao", "洛陽");
Trader t3 = new Trader("sunquan", "南京");
Trader t4 = new Trader("guanyu", "成都");
Trader t5 = new Trader("zhangfei", "成都");
Trader t6 = new Trader("zhaoyun", "成都");
初始化交易類
List<Transaction> transactionList = Arrays.asList(new Transaction(t1, "2011", 300),
new Transaction(t2, "2013", 500),
new Transaction(t3, "2014", 700),
new Transaction(t4, "2011", 600),
new Transaction(t5, "2012", 600),
new Transaction(t6, "2011", 200));