这是我的密码:
Optional<Application> application = this.applicationDao.findById(id);其中,Application类是:
public class Application {
private String code;
private Collection<ApplicationQuote> quotes;
}我需要像这样从返回的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)));发布于 2018-12-20 15:47:53
理想情况下,您目前拥有的是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());使用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)));发布于 2018-12-20 15:50:12
你在这里太复杂了。也就是说,您实际上不需要将app.quotes包装成可选的,只需要检查它是否为非空(实际上滥用了可选的主要目的)等等.
因为您想要一个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)));发布于 2018-12-20 15:37:00
像这样吗?
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));https://stackoverflow.com/questions/53871591
复制相似问题