我不知道 Stream API 的所有功能。
我的任务是:我有一个带有 url 的字符串列表,还有另一个带有两种方法的自定义对象列表
String videoFromUrl(String url);
boolean support(String url);
我应该从第一个列表中选择一个 url,第二个列表的一个实例将支持该 url,然后返回转换后的 url
我的代码是:
@Override
protected String videoSourceFromDocument(final Document document) {
final List<String> hrefs = ...;
for (final String href : hrefs) {
final Optional<VideoDownloader> videoDownloader = this.videoDownloaders/*this is my second list*/
.stream()
.filter(dwnldr->dwnldr.support(href))
.findFirst();
if(videoDownloader.isPresent()){
return videoDownloader.get().videoFromUrl(href);
}
}
this.logger().warn("Url {} doesn't has video source",document.baseUri());
throw new IllegalArgumentException();
}
使用 Stream API 重写它是否更好?
最佳答案
当您需要两个内部循环以命令式方式执行某些操作时,使用流执行相同操作的解决方案通常是使用 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>
, 以便调用者可以决定在没有视频源时要做什么。
关于java - 如何使用流 api 重写它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50664610/