203. Throwing checked exceptions from lambdas
Let’s suppose that we have the following lambda:
static void readFiles(List<Path> paths) {
  paths.forEach(p -> {
    try {
      readFile(p);
    } catch (IOException e) {
      ... // what can we throw here?
    }
  });
}
    What can we throw in the catch block? Most of you will know the answer; we can throw an unchecked exception such as a RuntimeException:
static void readFiles(List<Path> paths) {
  paths.forEach(p -> {
    try {
      readFile(p);
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  });
}
    Also, most people know that we cannot throw a checked exception such as an IOException. The following snippet of code will not compile:
static void readFiles(List<Path> paths) {
  paths.forEach(p -> {
    try {
      readFile(p);
    } catch (IOException e) {
      throw new IOException(e);
    }
  });
}
    Can we change this rule? Can we come up with a...