tec*_*360 2 java for-loop java-stream
我有一个像下面这样的 pojo 课程
public CategoryModel {
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个数组列表,如下所示。
List<CategoryModel> variantCategoryModelList = new ArrayList<>();
CategoryModel cat1= new CategoryModel();
cat1.setName(TEST1);
CategoryModel cat2= new CategoryModel();
cat2.setName(TEST1);
list.add(cat1);
list.add(cat2);
Run Code Online (Sandbox Code Playgroud)
我必须检查值“TEST1”和“TEST2”是否存在于列表中,如果两个值都存在于“列表”中,则返回“真”,我尝试了类似下面的方法,尽管我的“列表”同时具有值,它返回false。你能帮我检查一下我做错了什么顺便说一句我使用的是JDK 11。
final Optional<CategoryModel> optionalData = variantCategoryModelList.stream().
filter(valueData -> TEST1.equalsIgnoreCase(valueData.getName())
&& TEST2.equalsIgnoreCase(valueData.getName())).findFirst();
if(optionalData.isPresent()){
return true;
}
Run Code Online (Sandbox Code Playgroud)
您可以将您的CategoryModelto name 和 collect映射到字符串列表并调用List.containsAll:
return variantCategoryModelList.stream()
.map(CategoryModel::getName)
.collect(Collectors.toList())
.containsAll(Arrays.asList("TEST1","TEST2"));
Run Code Online (Sandbox Code Playgroud)
Set 将是一个更自然(更快)的数据结构:
return variantCategoryModelList.stream()
.map(CategoryModel::getName)
.collect(Collectors.toSet())
.containsAll(Set.of("TEST1", "TEST2"));
Run Code Online (Sandbox Code Playgroud)
你的问题是and ( &&) 而不是or。
所以:
Set<String> soughtNames = Set.of("TEST1", "TEST2");
return variantCategoryModelList.stream()
.filter(cm -> soughtNames.contains(cm.getName()))
.distinct()
.count() == 2L;
Run Code Online (Sandbox Code Playgroud)
正如@fps 评论的那样,distinct()需要在列表中防止 ["Test1", "Test1"] 被接受,或 ["Test1", "Test1", "Test2"] 失败。
这显然是低效的,因为它会 - 找到 2 个条目 - 仍然走到最后。
你要:
Set<String> soughtNames = Set.of("TEST1", "TEST2");
return soughtNames.stream()
.allMatch(soughtName ->
variantCategoryModelList.stream()
.anyMatch(cm -> soughtName.equals(cm.getName()));
Run Code Online (Sandbox Code Playgroud)
或者有点复古风格:
return
variantCategoryModelList.stream()
.anyMatch(cm -> "TEST1".equals(cm.getName())) &&
variantCategoryModelList.stream()
.anyMatch(cm -> "TEST2".equals(cm.getName()));
Run Code Online (Sandbox Code Playgroud)