Как создать другой список, если поток пуст - PullRequest
0 голосов
/ 06 декабря 2018

Есть ли хороший способ создать другой список, если поток пуст?

Здесь, если special пуст, я хочу создать новый List с другим значением.Но если special не пусто, я хочу создать List на основе special.Я не знаю, есть ли хороший способ объединить их с потоком

Вот не очень хорошее решение

class X {
    public static void main(String[] args) {
        String myString = "test";

        List<String> special = getSpecialVals();

        List<String> newVals = 
                special.isEmpty() ? 
                Arrays.asList(myString) : 
                special.stream().map(s -> 
                         createNewVal(s)).collect(Collectors.toList());
    }

    static public List<String> getSpecialVals() {
        // but can return empty list
        return Arrays.asList("One", "Two");
    }

    static public String createNewVal(String origVal) {
        return origVal.toUpperCase();
    }
}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Если вы настаиваете на том, чтобы держать его внутри потокового конвейера, вы можете сделать:

List<String> newVals = special.stream()
        .map(s -> createNewVal(s))
        .collect(Collectors.collectingAndThen(Collectors.toList(),
                l -> l.isEmpty() ? Collections.singletonList(myString) : l));

Мне больше нравится ваш собственный код.

В целом, вместо .map(s -> createNewVal(s)) вы можетеиспользуйте .map(X::createNewVal) (поскольку ваш класс называется X).Что выбрать, во многом зависит от вкуса.

0 голосов
/ 06 декабря 2018

, если вы хотите, чтобы он был одним конвейером, вы можете сделать:

List<String> strings = 
      Optional.of(special)
              .filter(e -> !e.isEmpty())
              .map(l -> l.stream().map(s -> createNewVal(s))
                                  .collect(Collectors.toList()))
              .orElseGet((() -> Collections.singletonList(myString)));

Однако я бы не рекомендовал использовать этот подход просто потому, что это не предназначенная цель Optional.

Вместо этого вам будет лучше:

List<String> result;
if(special.isEmpty())
   result = Collections.singletonList(myString);
else
   result = special.stream().map(s -> createNewVal(s)).collect(Collectors.toList());
  • Последнее определенно более читабельно, следовательно, требует меньше усилий для мозга, чтобы попытаться выяснить, что происходит.;)
  • Последний также избегает создания дополнительного экземпляра, что ведет к повышению эффективности
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...