Java List.contains (ArrayList <String>со значением поля, равным x) - PullRequest
1 голос
/ 30 января 2020

Используя приведенный ниже код, я могу проверить, содержит ли List объектов значение, соответствующее значению поля c.

public boolean containsName(final List<MyObject> list, final String name){
    return list.stream().filter(o -> o.getName().equals(name)).findFirst().isPresent();
}

Однако это работает только тогда, когда o.getName() возвращает String. Я пытаюсь изменить код, чтобы он работал, когда MyObject содержит ArrayList<String> и имя может соответствовать любому элементу в списке. Примерно так:

public boolean containsKeyword(final List<KeywordPOJO> list, final String keyword){
    return list.stream().filter(o -> o.getKeywordList().equals(keyword)).findFirst().isPresent();
}

Где KeywordPOJO возвращает список ключевых слов вместо одного String. Если keyword соответствует ЛЮБОМУ из этих ключевых слов, метод должен вернуть true.

В настоящий момент Eclipse выдает предупреждения: Unlikely argument type for equals(): String seems to be unrelated to ArrayList<String> (поскольку ключевое слово является строкой, а getKeywordList() возвращает ArrayList<String>)

Спасибо!

Ответы [ 2 ]

3 голосов
/ 30 января 2020

Попробуйте заменить:

list.stream().filter(o -> o.getKeywordList().equals(keyword)).findFirst().isPresent();

на:

list.stream().filter(o -> o.getKeywordList().contains(keyword)).findFirst().isPresent();

или короче:

list.stream().anyMatch(o -> o.getKeywordList().contains(keyword));
2 голосов
/ 30 января 2020

Вы можете просто использовать List.contains:

o -> o.getKeywordList().contains(keyword);

В качестве примечания, ваше выражение может быть упрощено с помощью Stream.anyMatch:

public boolean containsKeyword(final List<KeywordPOJO> list, final String keyword){
    return list.stream().anyMatch(o -> o.getKeywordList().contains(keyword));
}
...