簡體   English   中英

檢查數組列表是否包含兩個字符串

[英]Check if an arraylist contains two strings

我有一個像下面這樣的 pojo 課程

public CategoryModel {

public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

}

我創建了一個數組列表,如下所示。

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);

我必須檢查,如果列表中存在值“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;
        }

您可以將CategoryModel映射到 name 並收集到字符串列表並調用List.containsAll

return variantCategoryModelList.stream()
                               .map(CategoryModel::getName)
                               .collect(Collectors.toList())
                               .containsAll(Arrays.asList("TEST1","TEST2"));

Set 將是一個更自然(更快)的數據結構:

return variantCategoryModelList.stream()
                       .map(CategoryModel::getName)
                       .collect(Collectors.toSet())
                       .containsAll(Set.of("TEST1", "TEST2"));

你的問題是and ( && ) 而不是or

所以:

Set<String> soughtNames = Set.of("TEST1", "TEST2");
return variantCategoryModelList.stream()
                       .filter(cm -> soughtNames.contains(cm.getName()))
                       .distinct()
                       .count() == 2L;

正如@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()));

或者有點復古風格:

return
    variantCategoryModelList.stream()
             .anyMatch(cm -> "TEST1".equals(cm.getName())) &&
    variantCategoryModelList.stream()
             .anyMatch(cm -> "TEST2".equals(cm.getName()));

這是一種方法:

Set<String> set = Set.of("TEST1", "TEST2");
boolean result = list.stream()
    .filter(cat -> set.contains(cat.getName().toUpperCase())
    .distinct()
    .limit(2)
    .count() == 2L;

這會流式傳輸類別列表,然后僅保留名稱為TEST1TEST2類別。 然后我們刪除重復項並在找到兩個(已經不同的)類別名稱后停止。 這確保了短路 最后,我們檢查最后是否正好有兩個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM