我知道这是一个简单的问题。但是,我可以在Google上找到更多答案,但是您的答案可以给出不同的想法。我试图了解Java 8中引入的新功能。作为该过程的一部分,我编写了一些代码来读取目录中的文件并将它们放入InputStream列表中。如何使用Java 8简化以下代码?

File[] gred_files = gred_directory.listFiles();

List<InputStream> gredInputStreamList = new ArrayList<InputStream>();

for(File gred_file: gred_files) {
if(gred_file.isFile()) {
    InputStream gredStream = new FileInputStream(gred_file);
    if (gredStream != null)
    {
        gredInputStreamList.add(gredStream);
    }
  }
}

帮助将不胜感激。

最佳答案

List<InputStream> gredInputStreamList  = Arrays.stream(gred_directory.listFiles())
    .filter(File::isFile)
    .map(FileInputStream::new)
    .collect(Collectors.toList())

我不确定.map(FileInputStream::new)的一部分,因为有一个已检查的异常。也许我们这里需要一个辅助方法
InputStream openStream(File file) {
    try {
        return new FileInputStream(gred_file);
    } catch (IOException e) {
        return null;
    }
}

然后在这里做.map(WhateverClassThisIsIn::openStream)

甚至更好
Optional<InputStream> openStream(File file) {
    try {
        return Optional.of(new FileInputStream(gred_file));
    } catch (IOException e) {
        return Optional.empty();
    }
}


List<InputStream> gredInputStreamList  = Arrays.stream(gred_directory.listFiles())
    .filter(File::isFile)
    .map(WhateverClassThisIsIn::openStream)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList())

避免不必要的null值。 (尽管如此,这并不重要。)

07-26 01:59