2017-02-06 4 views
0

у меня есть такой код в старом стиле:Java Stream: как передать Set to Stream.of() и метод вызова для каждого элемента?

 if (setContainer.getSet() == null) { 
      return null; 
     } 
     for (SetElement setElement : setContainer.getSet()){ 
      if ("SomeString".equals(SetElement.getCode())) { 
       return setElement.getValue(); 
      } 
     } 
     return null; 

я попытался это, но это не проверить, если набор является пустым:

setContainer.getSet() 
        .stream() 
        .filter(setValue -> "SomeValue".equals(setElement.getCode())) 
        .map(SetElement::getValue) 
        .findAny() 
        .orElse(null) ; 

, как я понимаю, я должен использовать Stream.of() , но я не понять, как выполнить код, как описано выше, потому что он всегда возвращает Optional<Set<SetElement>>

+1

Почему вы должны использовать 'Stream.of()'? –

+0

как я, он будет проверять iset! = Null, или он не будет? – Igor

+1

Я не вижу этого в [doc] (https://docs.oracle.com/javase/8/docs/api/?java/util/stream/Stream.html). –

ответ

5

Вы можете использовать Optional.ofNullable для достижения этой цели:

return Optional.ofNullable(setContainer.getSet()) 
    .flatMap(set -> set.stream() 
     .filter(e -> "SomeValue".equals(e.getCode())) 
     .map(SetElement::getValue) 
     .findAny()) 
    .orElse(null); 
+0

Извините, вы были правы, Optional.flatMap возвращает Необязательный. –

+0

будет ли это возвращать null, если установлено == null или setElement == null? – Igor

+0

@Igor ~~ Он возвратит 'null' в обоих случаях ~~. Не ждите, меня отвлекает редактирование. Он вернет 'null', если набор был нулевым, или если ни один элемент не был найден, который удовлетворяет' filter'. –

2

Нет необходимости пытаться применять новые инструменты, когда существующие инструменты работают нормально. Поэтому, если вам нужна нулевая проверка, продолжайте ее проверять с помощью if.

set = setContainer.getSet(); 
if(set == null) { 
    return null; 
} else { 
    return mapAndFilter(set); 
} 

Или, с тройной оператор:

Set<T> set = setContainer.getSet(); 
return set == null ? null : mapAndFilter(set); 

Теперь вы можете реализовать mapAndFilter() чисто, принимая Map<T>, который гарантированно не будет нулевым, и возвращение Map<U>. Возможно, имеет смысл реализовать mapAndFilter() с использованием потоков.

Представляя Optional, вы просто добавляете ненужные объекты и ненужный беспорядок в код.

Это, скорее, стиль никогда не пропускает null, поэтому, если вы можете улучшить свой setContainer, чтобы он никогда не возвращал значение null (возможно, он может вернуть пустой набор?), Это было бы лучше.

Это май быть хорошим компромиссом, чтобы сделать setContainer Поставка Optional<Set<T>>. Но даже тогда, традиционные методы могут быть предпочтительнее функционального синтаксиса:

Optional<Set<T>> maybeSet = setContainer.getSet(); 

return maybeSet.isPresent() ? mapAndFilter(maybeSet.get()) : null; 
// vs 
return maybeSet.isPresent() ? mapAndFilter(maybeSet.get()) : Optional.empty(); 
// vs 
return maybeSet.map(mapAndFilterFunction); // might return empty Optional 
// vs 
return maybeSet.map(mapAndFilterFunction).orElse(null); // might return null; 

В этих mapAndFilter() является метод. mapAndFilterFunction является Function, определяемым как Function<Set<T>,Set<U>> mapAndFilterFunction = s -> { ... };

+1

Это хорошо, но я бы изменил 'return set == null? set: mapAndFilter (set); 'в следующую версию с явным * null *:' return set == null? null: mapAndFilter (set); '. Тот факт, что 'set' оказывается« нулевым »в этой точке, является случайным для логики этой линии; вы не хотите возвращать null * set *, но null * item *, поэтому я думаю, что яснее просто писать «null» явно. –

+0

Я хочу попробовать новый инструмент, также этот сокращенный код дважды – Igor

+1

+1, особенно для того, чтобы сказать, что использование Необязательно таким образом «добавляет ненужные объекты и ненужный беспорядок в код». Кроме того, если 'getSet()' возвращает Set, обычно предпочтительнее возвращать пустой набор, чем 'Optional >', если нет значений, которые нужно вернуть. –