当您需要两个内部循环以命令方式执行某项操作时,使用streams执行相同操作的解决方案通常是使用flatmap:
protected String videoSourceFromDocument(final Document document) {
final List<String> hrefs = ...;
return hrefs.stream()
.flatMap(href -> this.videoDownloaders.stream()
.filter(d -> d.support(href))
.map(d -> d.videoFromUrl(href)))
.findFirst()
.orElseThrow(() -> {
this.logger().warn("Url {} doesn't has video source", document.baseUri());
return new IllegalArgumentException();
});
}
不过,我会删除日志,并将信息性消息放入illegalargumentexception中。或者直接返回
Optional<String>
,以便来电者可以在没有视频源时决定要执行的操作。