Проверить условие внутри лямбда-выражения с помощью Stream API имеет проблемы с SonarQube - PullRequest
1 голос
/ 05 августа 2020

Итак, у меня есть код с объектом ArrayList of Properties.

@Getter
@Setter
class Properties {
    private String type;
    private String name;
    private String value;
}

Я должен проверить, не соответствует ли list.get(index) null, тогда, если list.get(index).getType() не null, тогда list.get(index).getType() равно "something", а затем вернуть значение.

Ниже мой код:

List<String> values = list.stream()
    .filter(Objects::nonNull)
    .filter(c -> c.getType() != null && c.getType().equals("something"))
    .map(Properties::getValue)
    .collect(Collectors.toList());

Моя проблема в том, что вторая часть фильтра имеет проблемы с SonarQube. Я должен реализовать это, используя методы stati c, как это сделано в части карты и первом фильтре.

Ответы [ 2 ]

0 голосов
/ 05 августа 2020
List<String> values = list.stream()
    .filter(Objects::nonNull)
    .filter(c -> Objects.equals("something", c.getType())
    .map(Properties::getValue)
    .collect(Collectors.toList());
0 голосов
/ 05 августа 2020

Я хотел бы знать правило SonarQube выделять здесь любую проблему. Если есть проблема, это определенность не связана с функциональностью, а с ясностью.

Единственное улучшение, которое я вижу, - это упрощение условий во втором filter методе:

List<String> values = list.stream()
    .filter(Objects::nonNull)
    .filter(c -> "something".equals(c.getType()))
    .map(Properties::getValue)
    .collect(Collectors.toList());

На самом деле нет необходимости в нулевой проверке, если вы используете безопасное сравнение ненулевых строк, которое никогда не приводит к NullPointerException.

...