检查数组列表是否包含两个字符串

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)

Eri*_*ean 6

您可以将您的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)

  • @fps 短路,只需执行相反的操作: `return Stream.of("TEST1","TEST2") .allMatch(s -&gt;variantCategoryModelList.stream().anyMatch(m -&gt; m.getName().equalsIgnoreCase (s)));` 我想说,这更简单。 (3认同)

Joo*_*gen 5

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)