2017-04-19 74 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