Потоки Java: необязательно для потоковой передачи - PullRequest
0 голосов
/ 20 декабря 2018

Это мой код:

Optional<Application> application = this.applicationDao.findById(id);

, где Application класс:

public class Application {
    private String code;    
    private Collection<ApplicationQuote> quotes;
}

Мне нужно создать поток из return Optional<Application>, например:

(app, quote-1) > (app, quote-2) > ... > (app, quote-n)

Где каждый quote-n внутри возвращается Optional<Application>.quotes.

Надеюсь, я так хорошо объяснил.

До сих пор я был в состояниинаписать этот код, но я не чувствую себя комфортно с этим:

Optional<Application> application = this.applicationDao.findById(id);
    application.map(app -> Pair.of(app, Optional.ofNullable(app.getQuotes())))
        .filter(quote -> quote.getValue().isPresent())
        .map(quote -> quote.getValue().get().stream().map(q -> Pair.of(quote.getKey(), q)));

Ответы [ 3 ]

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

Optional.orElse

В идеале у вас есть Optional<Stream<Pair<Application, ApplicationQuote>>> optionalPairStream, и то, что вы можете просто найти, просто добавьте случай по умолчанию и получите толькоStream as:

Stream<Pair<Application, ApplicationQuote>> pairStream = application
        .map(app -> Pair.of(app, Optional.ofNullable(app.getQuotes())))
        .filter(quote -> quote.getValue().isPresent())
        .map(quote -> quote.getValue().get().stream().map(q -> Pair.of(quote.getKey(), q)))
        .orElse(Stream.empty());

Optional.stream

В Java9 вы можете обновить тот же код, что и:

Stream<Pair<Application, ApplicationQuote>> pairStream = application
           .map(app -> Pair.of(app, Optional.ofNullable(app.getQuotes())))
           .filter(quote -> quote.getValue().isPresent())
           .stream() // new API
           .flatMap(quote -> quote.getValue().orElse(Collections.emptyList())
                   .stream().map(q -> Pair.of(quote.getKey(), q)));
0 голосов
/ 20 декабря 2018

Вы слишком усложняете вещи здесь.то есть вам на самом деле не нужно оборачивать app.quotes в необязательный параметр только для проверки, не является ли он ненулевым (что на самом деле нарушает основное назначение Optional) и т. д. *

, так как вы хотите Stream<Pair<Application, ApplicationQuote>>Вы можете сделать это следующим образом:

JDK8:

application.filter(app -> app.getQuotes() != null)
           .map(Stream::of).orElseGet(Stream::empty)
           .flatMap(app -> app.getQuotes().stream().map(quote -> Pair.of(app, quote)));

JDK9:

application.filter(app -> app.getQuotes() != null).stream()
           .flatMap(app -> app.getQuotes().stream().map(quote -> Pair.of(app, quote)));
0 голосов
/ 20 декабря 2018

Как то так?

Optional<Pair<String,List<String>> quotesForApp = 
     app.map(a -> a.getQuotes()
                     .stream()
                     .map(Quote::getValue())
                     .collect(toList()) // optional list of quotes now
        // we can call app.getCode() safely, or we wouldn't be mapping
        .map(quotes -> Pair.of(app.getCode(), quotes));
...