2017-04-19 73 views
2

通過鍵排序我有一個簡單地用三個值類:收集通過流

class Book{ 
    private String title; 
    private String author; 
    private double price; 
} 

title是唯一的(總是)。系統中有一個選定的標題列表(如List<String>)和每個Book的列表。我想從標題列表中獲得所有Book。我的代碼是:

List<Book> allBooks = getAllBooks(); 
List<String> selectedTitles = getSelectedTitles(); 
List<Book> selectedBooks = allBooks.stream(). 
    filter(x -> selectedTitles.contains(x.getTitle())). 
    collect(Collectors.toList()); 

它的工作原理,但selectedBooks被下令allBook insted的的selectedTitles。例如:?

allBooks(only title) = {"A","B","C","D"} 
selectedTitles = {"B","A","D"} 
selectedBooks(only title) = {"A","B","D"} 

怎麼可能(通過stream()得到由selectedTitles排序(在這個例子應該是{"B","D","A"}

回答

7

不要排序,只要查看已經選擇的書籍:

List<Book> allBooks = getAllBooks(); 
List<String> selectedTitles = getSelectedTitles(); 

Map<String,Book> titleToBook = allBooks.stream() 
    .collect(Collectors.toMap(Book::getTitle, Function.identity())); 

List<Book> selectedBooks = selectedTitles.stream() 
    .map(titleToBook::get).filter(Objects::nonNull) 
    .collect(Collectors.toList()); 
0

這是你應該做的:?

selectedTitles.stream() 
     .map(x -> b.stream() 
       .filter(y -> y.getName().equals(x)) 
       .findFirst() 
       .orElse(null)) 
     .collect(Collectors.toList()); 
+0

第一個s解決方案不起作用(它按字母順序對'selectedBooks'進行排序,而不是按'selectedTitles'順序排序)。讓我檢查第二個 –

+0

@RealSkeptic哦,我在問題中看到了「B,D」,並立即認爲OP需要字母順序。我正在考慮另一種解決方案! – Sweeper

+0

@joepaulens查看最新的答案。 – Sweeper