首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java :可选流

Java :可选流
EN

Stack Overflow用户
提问于 2018-12-20 15:29:44
回答 3查看 529关注 0票数 3

这是我的密码:

代码语言:javascript
复制
Optional<Application> application = this.applicationDao.findById(id);

其中,Application类是:

代码语言:javascript
复制
public class Application {
    private String code;    
    private Collection<ApplicationQuote> quotes;
}

我需要像这样从返回的Optional<Application>创建一个流:

代码语言:javascript
复制
(app, quote-1) > (app, quote-2) > ... > (app, quote-n)

每个quote-n都在返回的Optional<Application>.quotes中。

我希望我解释得很清楚。

到目前为止,我已经能够编写这段代码了,但我觉得无法适应:

代码语言:javascript
复制
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)));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-20 15:47:53

Optional.orElse

理想情况下,您目前拥有的是Optional<Stream<Pair<Application, ApplicationQuote>>> optionalPairStream,您可能只需要添加一个默认的大小写,并将Stream作为:

代码语言:javascript
复制
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,您可以更新与以下相同的代码:

代码语言:javascript
复制
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)));
票数 1
EN

Stack Overflow用户

发布于 2018-12-20 15:50:12

你在这里太复杂了。也就是说,您实际上不需要将app.quotes包装成可选的,只需要检查它是否为非空(实际上滥用了可选的主要目的)等等.

因为您想要一个Stream<Pair<Application, ApplicationQuote>>,所以可以这样做:

JDK8:

代码语言:javascript
复制
application.filter(app -> app.getQuotes() != null)
           .map(Stream::of).orElseGet(Stream::empty)
           .flatMap(app -> app.getQuotes().stream().map(quote -> Pair.of(app, quote)));

JDK9:

代码语言:javascript
复制
application.filter(app -> app.getQuotes() != null).stream()
           .flatMap(app -> app.getQuotes().stream().map(quote -> Pair.of(app, quote)));
票数 3
EN

Stack Overflow用户

发布于 2018-12-20 15:37:00

像这样吗?

代码语言:javascript
复制
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));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53871591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档