当前位置: 首页 > 面试题库 >

有没有办法在一个Java8流中读取两个或更多文件?

李星辰
2023-03-14
问题内容

我喜欢新的Java8 StreamAPI,并希望不仅将其用于一个文件。通常,我使用以下代码

Stream<String> lines = Files.lines(Paths.get("/somepathtofile"));

但是,如果可能的话,如何在一个流中读取两个文件呢?


问题答案:

没有任何额外的帮助程序功能或外部库,最简单的方法是:

Stream<String> lines1 = Files.lines(Paths.get("/somepathtofile"));
Stream<String> lines2 = Files.lines(Paths.get("/somepathtoanotherfile"));

Stream.concat(lines1, lines)
    .filter(...)
    .forEach(...);

如果Files.lines尚未声明抛出受检查的异常,则可以

Stream.of("/file1", "/file2")
     .map(Paths::get)
     .flatMap(Files::lines)....

但是,a,我们不能这样做。有几种解决方法。一种是制作自己的版本,将Files.lines其称为标准版本,然后将其IOException作为捕获并重新抛出UncheckedIOException。另一种方法是使用抛出检查异常的方法来制造函数的更通用的方法。它看起来像这样:

@FunctionalInterface
public interface ThrowingFunction<T,R> extends Function<T,R> {

    @Override
    public default R apply(T t) {
        try {
            return throwingApply(t);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static<T,R> Function<T,R> wrap(ThrowingFunction<T,R> f) {
        return f;
    }

    R throwingApply(T t) throws Exception;
}

然后

Stream.of("/somefile", "/someotherfile", "/yetanotherfile")
        .map(Paths::get)
        .flatMap(ThrowingFunction.wrap(Files::lines))
        .....

那里有几个库需要为每个功能接口编写类似上面的内容的麻烦。



 类似资料:
  • 我想有一个以上的regex如下所示,我如何将其添加到flatmap迭代器中,以便在单个流读取期间将该行的所有匹配值列表? 这个问题是从匹配模式和使用Java8 stream将流写入文件中的扩展

  • 问题内容: 我知道Java不允许我们扩展多个类。我知道接口也存在,并且我这次不想使用它们。是否存在某种技巧或解决方法来扩展Java中的多个类?如果是,请同时提供示例代码。 问题答案: 您可以使用界面和组合 轻松 完成此操作。 问题是为什么你会问这样的事情?为什么不希望在“此时”使用接口? 您必须知道Java仅允许实现的单一继承。您在SO上度过了七个月,因此,您肯定必须知道如何使用搜索功能。这个问题

  • 我有一个需求,我想找到运行的jar中的jar的路径。假设有一个名为example-1.0.0.jar的罐子在一个名为main-1.0.0.jar.的运行罐子里,我想知道运行罐子里存在的罐子的路径。 编辑1:例如,jar是项目中的一个依赖项。例如,假设我的项目中有一个log4j依赖项,我想知道log4j jar在类中的路径。我怎样才能找到路?

  • 我们使用PHP7.0运行XAMPP是因为我们的新产品需要PHP7。 但是有些老项目使用等函数,这些函数在PHP7.0中被删除。 那么,有没有办法在XAMPP中轻松更改PHP版本呢? 注意:请不要建议将旧项目升级到与新版本兼容,因为我不能这样做,因为作为一个开发人员(只是一个员工),我不能得到这些决定。

  • 问题内容: 我已经构建了一种通过$ http返回资源的复杂方法。 该方法返回一个Promise,然后检查资源是否存在我的本地缓存。如果这样做,它将返回缓存的资源,否则,将发出$ http请求。在资源被缓存后,这种方法效果很好,但是在整个应用程序中,我有多种功能正在按此方法加载,并且每个函数都会发出http请求,因为资源尚未返回和缓存。 我想出了一个简单的检查方法来解决此问题,但我觉得应该有一个更好

  • 我想读取Dockerfile中的变量,该变量在文件中定义。有什么办法可以做到这一点吗? 这是我的DockerFile: