Java 8:Map而不是简单的循环

时间:2017-01-16 14:02:18

标签: java foreach java-8 java-stream

我是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不感兴趣

3 个答案:

答案 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));           
    }

参考

Lambda and Method reference concise details

答案 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