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)
你可以简单地:
List<Book> books =
library.stream()
.filter(b -> b.properties.entrySet().containsAll(criteria.entrySet()))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这将过滤书籍,只保留其属性包含所有给定条件的书籍.使用完成检查containsAll,这意味着它将保留包含完全给定条件的属性(通过条目的相等性匹配,因此键和值都相等).