我是java 1.8中函数式编程的新手。 我有简单的循环,如下面的代码:
File folder = new File("./src/renamer/Newaudio");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
System.out.println("Here is file number: " + i);
}
我将使用箭头功能(如lambda)将上部for loop
更改为功能格式。
listOfFiles.map((file) = > {
System.out.println("Here is file number: " + i);
});
不幸的是,它抱怨:
Cannot invoke map((<no type> file) -> {}) on the array type File[]
为什么我收到此错误? 我该如何解决?
我想了解Lambda,所以我对foreach不感兴趣
答案 0 :(得分:4)
您可以使用IntStream.range
仅打印文件编号
IntStream.range(0,listOfFiles.length).forEach(System.out::println);
或要打印数组内容,您可以使用
Arrays.stream(listOfFiles).forEach(System.out::println);
编译器会将您的方法引用转换为 编译时的lambda表达式,所以这个
Arrays.stream(listOfFiles).forEach(System.out::println);
将转换为此
=> Arrays.stream(listOfFiles).forEach(i->System.out.println(i));
使用lambda,你也可以使用扩展的lambda {}
=> Arrays.stream(listOfFiles).forEach(i->{
if (!i.isHidden()) { // don't print hidden files
System.out.println(i);
}
});
所以listFiles
返回null
文件不是目录,为简单起见,您只需在第一个地方检查
File folder = new File("./src/renamer/Newaudio");
if (folder.isDirectory()) {
File[] listOfFiles = folder.listFiles();
Arrays.stream(listOfFiles).forEach(i->System.out.println(i));
}
参考
答案 1 :(得分:3)
IntStream.range(0, listOfFiles.length).forEach(file -> {
System.out.println(file);
});
答案 2 :(得分:3)
folder.listFiles()
应与Optional.ofNullable
打包在一起以阻止NullPointerException
。如果给定的路径名不表示目录,或者发生I / O错误,它可以返回null
。
Stream.of(ofNullable(folder.listFiles()).
orElseThrow(() -> new IllegalArgumentException("It's not a directory!")))
.forEach(f -> {});
forEach
方法可以采用这些参数:
(1)匿名类
new Consumer<File>() {
public @Override void accept(File file) {
System.out.println(file);
}
}
(2)扩展的lambda表达式
(File f) -> { System.out.println(f); }
(f) -> { System.out.println(f); }
(3)简化的lambda表达式
f -> { System.out.println(f); }
f -> System.out.println(f)
(4)方法参考
System.out::println