我不知道Stream API的所有功能.
我的任务是:我有一个带有url的字符串列表,我有两个方法的自定义对象列表
String videoFromUrl(String url);
boolean support(String url);
Run Code Online (Sandbox Code Playgroud)
我应该从第一个列表中选择一个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();
}
Run Code Online (Sandbox Code Playgroud)
是使用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();
});
}
Run Code Online (Sandbox Code Playgroud)
我会删除日志,并将信息性消息放在IllegalArgumentException中.或者只是返回一个Optional<String>,以便调用者可以决定在没有视频源时该怎么做.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |