天天看點

Java8 Lamdba表達式 002

本篇将講述lamdba表達式的排序,本例包含一個Player對象的集合[稍後定義],通過每個player的分數高低對清單的player進行排序,類定義001如下 

public class SortingPlayer {
	
	public static void main(String[] args) {
		List<Player> playerList = new ArrayList<>();
		playerList.add(new Player("Black", "White", 9));
		playerList.add(new Player("John", "Hello", 2));
		playerList.add(new Player("Machicel", "Jackson", 7));
		playerList.add(new Player("Ani", "Hessius", 4));
		playerList.add(new Player("Mark", "Towns", 3));
		playerList.add(new Player("Huge", "Nana", 6));
	}
}

class Player{
	private String firstName;
	private String lastName;
	private int goals;
	
	public Player(String firstName, String lastName, int goals) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.goals = goals;
	}
	
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public int getGoals() {
		return goals;
	}
	public void setGoals(int goals) {
		this.goals = goals;
	}
}
           

簡單起見把代碼寫在一個類裡,Player定義了firstname,lastname,goals,Main方法 建立一個集合并往其中添加了幾個元素。

002下面的代碼在添加在001main方法list後

Comparator<Player> byGoals = Comparator.comparing(Player::getGoals);
System.out.println("== Sort by Number of Goals ==");
playerList.stream().sorted(byGoals)
		.map(p -> p.getFirstName() + " " + p.getLastName() + " - "
				+ p.getGoals())
		.forEach(element -> System.out.println(element));
           

使用Player對象的getter方法[根據你想排序的那個字段,本例使用goals]建立一個Comparator - Player::getGoals 。然後使用混合的lamdba表達式和streams,forEach(),展示排序後的集合。

java8中集合排序又新加了可以極大提高開發效率的3個新特性。分别是lamdba表達式,方法引用以及stream。對于方法引用和stream這裡隻做簡單介紹,Stream可以在集合資料[collections]中使用,它允許集合中的元素進行函數式操作。Stream不存儲資料,它能讓獲得的集合具有更多功能。

002中,Comparator根據計算的goals生成,Player::getGoals。然後根據playerList生成stream。stream提供sorted()功能,它接收一個Comparator,Comparator在傳遞給sorted()時已經完成初始化,然後調用map()功能,map使用一個lamdba表達式拼一個firstname,lastname,&goals的字元串。最後由于List<Player>是可疊代的,它包含forEach()方法,forEach()方法允許集合中的每個元素應用表達式或狀态組。本例中,每個元素都在指令行列印,由于map()功能已經在stream中應用,是以最後結果是列印按照goals排好序的每個元素的firstname,lastname,&goals拼的字元串。如下所示:

== Sort by Number of Goals ==
John Hello - 2
Mark Towns - 3
Ani Hessius - 4
Huge Nana - 6
Machicel Jackson - 7
Black White - 9
           

除了使用002所示的方法進行排序,我們還可以使用Collections集合提供的sort()方法:Collections.sort(),見003

System.out.println("== utilize the Collections.sort()method ==");
Collections.sort(playerList, (p1,p2) 
		-> p1.getLastName().compareTo(p2.getLastName()));
playerList.stream().forEach((p) -> {
	System.out.println(p.getLastName());
});
           

003中 Collections.sort()第一個參數是要排序的集合本身List<Player>,第二個參數是排序的lamdba實作,本例中傳入兩個參數都是Player對象,比較他們的lastname,是以這個排序将會對集合元素的lastname進行升序排序。排序後生成stream然後forEach使用lamdba表達式列印出排序後集合每個元素的lastname,如下所示:

== utilize the Collections.sort()method ==
Hello
Hessius
Jackson
Nana
Towns
White
           

無疑,lamdba表達式極大的減少了集合排序所需的代碼。而且使代碼更易讀。本篇講到這兒。更多特性,下回分解。

ps:本文示例引自 Josh Juneau所著 Java 8 Recipes, 2nd Edition

mission completed!

O(∩_∩)O~