0

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, fallowed by a new line and 2 methods? Never seen such a thing before.
  3. How can I make this work properly?
Daniel Oscar
  • 287
  • 1
  • 9
  • 1
    "This code does not work." Please supply an adequate error description, including a full copy of the error and edit it into the question. – Maarten Bodewes Apr 26 '20 at 21:19
  • 1
    1 may google it (https://stackoverflow.com/questions/20001427/double-colon-operator-in-java-8). 2 just return line, same as `paths.filter(Files::isRegularFile).forEach(levels.add(new Level(file)));` which is Stream (chaining method here) – azro Apr 26 '20 at 21:20
  • You should put a lambda like `(file) -> levels.add(new Level(file))` into the forEach instead of an expression – user Apr 29 '20 at 14:43

1 Answers1

1
  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());
azro
  • 53,056
  • 7
  • 34
  • 70