java - 如何使用流 api 重写它

标签 java java-stream

我不知道 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/

相关文章:

java - 当字符串在 Java 8 中没有分隔符时,根据提供的键从字符串创建映射

java - 如何使用 JsonAutoDetect 实现旧 Firebase 中可用的技巧?

java - 使用 Stream API 的对象的 Sum 属性

java - 数据库和文件持久化之间的接口(interface)

java - 创建名称为 "sessionFactory"的 bean 时出错

Java 8 流分组通过使用比较器

dictionary - Java 8 将 Map<Department, List<Person>> 转换为 Map<Department, List<String>>

java - 为什么 Stream::flatMap 的这种用法是错误的?

java - 当应用程序移至后台时,在前台服务中获取位置更新不起作用

java - Xqual 和 Junit : parameters?