2016-04-28 51 views
1

如何使用Java Stream Api替换此代码?Java Stream Api INNER JOIN两个列表

for (Book book : Books.getAllBooks()) { 
     for (SearchResult searchResult : searchResultList) { 
      if (searchResult.getTableName().replace("attr_", "") .equals(book.getTableName())) { 
      bookList.add(book); 
      } 
     } 
     } 
+1

那你试试? – Tunaki

回答

2
List<Book> bookList = Books.getAllBooks().stream() 
      .filter(e -> searchResultList.stream() 
         .anyMatch(f -> e.getTableName().equals(f.getTableName().replace("attr_", "")))) 
      .collect(Collectors.toList()); 
2

我从C#来了,错过了在Java的API 8这个功能,所以我写了我自己。 随着streamjoin你可以写

Stream<Book> books = 
join(Books.getAllBooks().stream()) 
.withKey(Book::getTableName) 
.on(searchResultList.stream()) 
.withKey(SearchResult::getTableName) 
.combine((book, searchResult) -> book) 
.asStream() 
0

正是你问什么,但这里有一个技巧,如果你使用的番石榴:

List<Book> bookList = new ArrayList<>(Books.getAllBooks()); 
Lists.transform(bookList, Book::getTableName) 
     .retainAll(Lists.transform(searchResultList, r -> r.getTableName().replace("attr_", ""));