Создать поток Java 8 из обнуляемого списка - PullRequest
0 голосов
/ 24 июня 2018

Есть ли способ проверить ноль в java8, если list равен null, вернуть null, иначе выполните операции.

 public Builder withColors(List<String> colors) {
        this.colors= colors== null ? null :
                colors.stream()
                .filter(Objects::nonNull)
                .map(color-> Color.valueOf(color))
                .collect(Collectors.toList());

        return this;
    }

Я вижу, что есть возможность использовать

Optional.ofNullable(list).map(List::stream) 

но таким образом я получаю код ошибки на Color.valueOf (цвет)

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Есть пара вещей, которые вы можете переосмыслить.

Прежде всего, передача Set<String> colors вместо List будет иметь больше смысла, поскольку кажется, что Color - это перечисление для начала. Тогда, возможно, было бы более разумно проверить по equalsIgnoreCase, чтобы red или RED все равно производили экземпляр enum. Также if statement, вероятно, намного более понятен для проверки на возможный нулевой ввод. И последний поток в обратном направлении - из enum будет иметь больше смысла (также избегая нулевой проверки). Я не выполнил рекомендации выше, просто для простоты.

public Builder withColors(List<String> colors) {
    if(colors == null){
        this.colors = Collection.emptyList();
    }

    this.colors = EnumSet.allOf(Color.class)
            .stream()
            .filter(x -> colors.stream().anyMatch(y -> x.toString().equals(y)))
            .collect(Collectors.toList());
    return this;
}
0 голосов
/ 24 июня 2018

Optional.ofNullable(list).map(List::stream) даст вам Optional<Stream<String>>, который вы не можете назвать filter вкл.

Вы можете поместить всю обработку Stream в Optional map():

public Builder withColors(List<String> colors) {
    this.colors = Optional.ofNullable(colors).map(
        list -> list.stream()
                    .filter(Objects::nonNull)
                    .map(color-> Color.valueOf(color))
                    .collect(Collectors.toList()))
                    .orElse(null);
    return this;
}
...