我知道这是一个简单的问题。但是,我可以在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
值。 (尽管如此,这并不重要。)