簡體   English   中英

Java流:流可選

[英]Java streams: Optional to stream

這是我的代碼:

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)));

你在這里過分復雜。 即你實際上不需要將app.quotes包裝成一個可選項來檢查它是否為非null(實際上濫用了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)));

Optional.orElse

理想情況下,您目前擁有的是Optional<Stream<Pair<Application, ApplicationQuote>>> optionalPairStream以及您可能正在尋找的內容,只需添加一個默認大小寫,並將Stream作為:

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)));

像這樣的東西?

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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM