如何使用stream api重写它

Alm*_*zak 2 java java-stream

我不知道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重写它的更好方法吗?

JB *_*zet 6

当你需要两个内部循环以命令方式执行某些操作时,使用流做同样事情的解决方案通常是使用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>,以便调用者可以决定在没有视频源时该怎么做.

  • 意思是`.map(d - > d.videoFromUrl(href)))`? (2认同)