javafilelambdajava-streammethod-reference

Syntax error when reading from a File folder and adding each to an ArrayList


Consider this piece of code:

private static ArrayList<Level> levels = new ArrayList<>();

static {
    try (Stream<Path> paths = Files.walk(Paths.get("levels"))) {
        paths
            .filter(Files::isRegularFile)
            .forEach(levels.add(new Level(file))); //CAN'T DO!!
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

I think the code pretty much says what I'm trying to do. I found this piece of code somewhere and I tried to apply it, to create Level objects from folder with files such as level1.txt, level2.txt, etc. The Level class takes a File as argument.

The forEach method gives out a SyntaxError.

  1. What are the "::" in the filter method?
  2. Why is the path followed by a new line and 2 methods? I've never seen such a thing before.
  3. How can I make this work properly?

Solution

    1. The following explains well what is :: (double colon) operator since Java 8

    2. Code can be run written on several lines, but this is same as the following. Your calling the method filter then calling forEach on the object returned by filter

      paths.filter(Files::isRegularFile).forEach(levels.add(new Level(file)));   
      
    3. Get it work, you need to define file variable this is done with lambda functions

      paths.filter(Files::isRegularFile).forEach(file -> levels.add(new Level(file)));   
      

    NOT POSSIBLE because walks() throws IOException

    In case you don't need the try/catch you can use Collectors to directly build the list

    private static ArrayList<Level> levels = Files.walk(Paths.get("levels"))
                                                  .filter(Files::isRegularFile)
                                                  .map(file -> new Level(file))
                                                  .collect(Collectors.toList());