使用地图中的值过滤pojos流

Cri*_*ano 3 java lambda java-8 java-stream

我有这个pojo(这是一个例子,而不是真实的例子):

Book {
  String name;
  Map<String, String> properties;
}
Run Code Online (Sandbox Code Playgroud)

以及它们的清单:

List<Book> library;

TheBook1, {["lang", "pt-br"],["type","romance"],["author","John"]}
TheBook2, {["lang", "en-US"],["type","fiction"],["author","Brian"],["translation","pt-br,es"}
Run Code Online (Sandbox Code Playgroud)

假设我有一个Library集合,并且我有一个包含搜索条件的地图,例如:

Map<String, String> criteria = new HashMap<>();
criteria.put(BOOK_TYPE, "romance");
criteria.put(BOOK_LANG, "pt-br");
Run Code Online (Sandbox Code Playgroud)

我如何为库流编写过滤谓词,以便搜索符合所提供标准的所有书籍?匹配必须是现在的键和值的精确字符串匹配.

像这样的东西:

Set<Book> result = library.stream()
.filter(b-> b.getProperties() **????**)
.collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 5

你可以简单地:

List<Book> books = 
    library.stream()
           .filter(b -> b.properties.entrySet().containsAll(criteria.entrySet()))
           .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这将过滤书籍,只保留其属性包含所有给定条件的书籍.使用完成检查containsAll,这意味着它将保留包含完全给定条件的属性(通过条目的相等性匹配,因此键和值都相等).