Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java8流内部抛出已检查的异常?_Java_Lambda_Java 8_Java Stream_Checked Exceptions - Fatal编程技术网

如何从Java8流内部抛出已检查的异常?

如何从Java8流内部抛出已检查的异常?,java,lambda,java-8,java-stream,checked-exceptions,Java,Lambda,Java 8,Java Stream,Checked Exceptions,如何从Java8 streams/lambdas内部抛出已检查的异常 换句话说,我想编译如下代码: public List<Class> getClasses() throws ClassNotFoundException { List<Class> classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")

如何从Java8 streams/lambdas内部抛出已检查的异常

换句话说,我想编译如下代码:

public List<Class> getClasses() throws ClassNotFoundException {     

    List<Class> classes = 
        Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
              .map(className -> Class.forName(className))
              .collect(Collectors.toList());                  
    return classes;
    }
public List getClasses()抛出ClassNotFoundException{
列表类=
Stream.of(“java.lang.Object”、“java.lang.Integer”、“java.lang.String”)
.map(className->Class.forName(className))
.collect(Collectors.toList());
返回类;
}
此代码不会编译,因为上面的
Class.forName()
方法会抛出
ClassNotFoundException
,这是选中的


请注意,我不想将选中的异常包装到运行时异常中,而是抛出包装好的未选中异常我想抛出选中的异常本身,在不向流中添加丑陋的
的情况下,尝试
/
捕获

LambdaExceptionUtil
帮助类允许您在Java流中使用任何选中的异常,如下所示:

Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
      .map(rethrowFunction(Class::forName))
      .collect(Collectors.toList());
注意
Class::forName
抛出
ClassNotFoundException
,该异常已选中。流本身也抛出
ClassNotFoundException
,而不是一些未经检查的异常

public final class LambdaExceptionUtil {

@FunctionalInterface
public interface Consumer_WithExceptions<T, E extends Exception> {
    void accept(T t) throws E;
    }

@FunctionalInterface
public interface BiConsumer_WithExceptions<T, U, E extends Exception> {
    void accept(T t, U u) throws E;
    }

@FunctionalInterface
public interface Function_WithExceptions<T, R, E extends Exception> {
    R apply(T t) throws E;
    }

@FunctionalInterface
public interface Supplier_WithExceptions<T, E extends Exception> {
    T get() throws E;
    }

@FunctionalInterface
public interface Runnable_WithExceptions<E extends Exception> {
    void run() throws E;
    }

/** .forEach(rethrowConsumer(name -> System.out.println(Class.forName(name)))); or .forEach(rethrowConsumer(ClassNameUtil::println)); */
public static <T, E extends Exception> Consumer<T> rethrowConsumer(Consumer_WithExceptions<T, E> consumer) throws E {
    return t -> {
        try { consumer.accept(t); }
        catch (Exception exception) { throwAsUnchecked(exception); }
        };
    }

public static <T, U, E extends Exception> BiConsumer<T, U> rethrowBiConsumer(BiConsumer_WithExceptions<T, U, E> biConsumer) throws E {
    return (t, u) -> {
        try { biConsumer.accept(t, u); }
        catch (Exception exception) { throwAsUnchecked(exception); }
        };
    }

/** .map(rethrowFunction(name -> Class.forName(name))) or .map(rethrowFunction(Class::forName)) */
public static <T, R, E extends Exception> Function<T, R> rethrowFunction(Function_WithExceptions<T, R, E> function) throws E {
    return t -> {
        try { return function.apply(t); }
        catch (Exception exception) { throwAsUnchecked(exception); return null; }
        };
    }

/** rethrowSupplier(() -> new StringJoiner(new String(new byte[]{77, 97, 114, 107}, "UTF-8"))), */
public static <T, E extends Exception> Supplier<T> rethrowSupplier(Supplier_WithExceptions<T, E> function) throws E {
    return () -> {
        try { return function.get(); }
        catch (Exception exception) { throwAsUnchecked(exception); return null; }
        };
    }

/** uncheck(() -> Class.forName("xxx")); */
public static void uncheck(Runnable_WithExceptions t)
    {
    try { t.run(); }
    catch (Exception exception) { throwAsUnchecked(exception); }
    }

/** uncheck(() -> Class.forName("xxx")); */
public static <R, E extends Exception> R uncheck(Supplier_WithExceptions<R, E> supplier)
    {
    try { return supplier.get(); }
    catch (Exception exception) { throwAsUnchecked(exception); return null; }
    }

/** uncheck(Class::forName, "xxx"); */
public static <T, R, E extends Exception> R uncheck(Function_WithExceptions<T, R, E> function, T t) {
    try { return function.apply(t); }
    catch (Exception exception) { throwAsUnchecked(exception); return null; }
    }

@SuppressWarnings ("unchecked")
private static <E extends Throwable> void throwAsUnchecked(Exception exception) throws E { throw (E)exception; }

}
注1:上述
LambdaExceptionUtil
类的
rethrow
方法可以毫无恐惧地使用,并且在任何情况下都可以使用。非常感谢帮助解决最后一个问题的用户@PaoloC:现在编译器将要求您添加throw子句,一切都好像您可以在Java8流上本机抛出已检查的异常一样


注2:上述
LambdaExceptionUtil
类的
取消选中的
方法是额外的方法,如果您不想使用它们,可以安全地将它们从类中删除。如果您确实使用了它们,请在理解以下用例、优点/缺点和局限性之前小心使用:

•如果调用的方法不能抛出它声明的异常,则可以使用
取消选中
方法。例如:新字符串(byteArr,“UTF-8”)抛出UnsupportedEncodingException,但Java规范保证UTF-8始终存在。在这里,throws声明是一个讨厌的东西,任何用最少的样板文件使其静音的解决方案都是受欢迎的:
stringtext=uncheck(()->newstring(byteArr,“UTF-8”)

•如果您正在实现一个严格的接口,而您没有添加抛出声明的选项,并且抛出异常是完全合适的,那么您可以使用
取消选中
方法。包装一个异常只是为了获得抛出它的特权,结果会产生一个带有虚假异常的stacktrace,这些异常不会提供关于实际出错的信息。一个很好的例子是Runnable.run(),它不会抛出任何已检查的异常

•在任何情况下,如果您决定使用
取消选中
方法,
请注意在没有throws子句的情况下抛出已检查异常的这两个后果:1)调用代码将无法按名称捕获它(如果您尝试,编译器将说:在相应try语句的主体中永远不会抛出异常)。它将冒泡,并可能被一些“catch Exception”或“catch Throwable”捕获到主程序循环中,这可能是您想要的。2) 它违反了最小意外原则:捕获
RuntimeException
以保证捕获所有可能的异常将不再足够。出于这个原因,我认为这不应该在框架代码中完成,而应该只在您完全控制的业务代码中完成

  • 参考资料:
    • Lombok项目注释:@sleekythrows
    • Brian Goetz的意见(反对)如下:
    • *

    • 你不能安全地这样做。你可以作弊,但随后你的程序被破坏了,这将不可避免地再次伤害到某人(应该是你,但我们的作弊通常会伤害到其他人)

      这里有一个稍微安全一点的方法(但我还是不推荐这样做)


      在这里,您要做的是捕获lambda中的异常,从流管道中抛出一个指示计算异常失败的信号,捕获该信号,并对该信号执行操作以抛出底层异常。关键是您总是捕获合成异常,而不是允许已检查的异常泄漏而不声明抛出该异常

      你的问题的简单答案是:你不能,至少不能直接回答。这不是你的错。甲骨文把事情搞砸了。他们坚持检查异常的概念,但在设计功能接口、流、lambda等时却始终忘记了检查异常。这是像Robert C.Martin这样称检查异常为失败实验的专家们最担心的

      在我看来,这是API中的一个大错误,也是语言规范中的一个小错误

      API中的错误在于,它没有提供转发已检查异常的功能,而这实际上对函数式编程非常有意义。正如我将在下面演示的那样,这样的设施是很容易实现的

      语言规范中的缺陷在于,它不允许类型参数推断类型列表而不是单个类型,只要类型参数仅在允许类型列表的情况下使用(
      throws
      子句)

      作为Java程序员,我们期望编译以下代码:

      import java.util.ArrayList;
      import java.util.List;
      import java.util.stream.Stream;
      
      public class CheckedStream {
          // List variant to demonstrate what we actually had before refactoring.
          public List<Class> getClasses(final List<String> names) throws ClassNotFoundException {
              final List<Class> classes = new ArrayList<>();
              for (final String name : names)
                  classes.add(Class.forName(name));
              return classes;
          }
      
          // The Stream function which we want to compile.
          public Stream<Class> getClasses(final Stream<String> names) throws ClassNotFoundException {
              return names.map(Class::forName);
          }
      }
      
      函数接口的定义方式目前阻止编译器转发异常-没有声明告诉
      Stream.map()
      如果
      Function.apply()抛出Eclass WrappedException extends RuntimeException {
          Throwable cause;
      
          WrappedException(Throwable cause) { this.cause = cause; }
      }
      
      static WrappedException throwWrapped(Throwable t) {
          throw new WrappedException(t);
      }
      
      try 
          source.stream()
                .filter(e -> { ... try { ... } catch (IOException e) { throwWrapped(e); } ... })
                ...
      }
      catch (WrappedException w) {
          throw (IOException) w.cause;
      }
      
      import java.util.ArrayList;
      import java.util.List;
      import java.util.stream.Stream;
      
      public class CheckedStream {
          // List variant to demonstrate what we actually had before refactoring.
          public List<Class> getClasses(final List<String> names) throws ClassNotFoundException {
              final List<Class> classes = new ArrayList<>();
              for (final String name : names)
                  classes.add(Class.forName(name));
              return classes;
          }
      
          // The Stream function which we want to compile.
          public Stream<Class> getClasses(final Stream<String> names) throws ClassNotFoundException {
              return names.map(Class::forName);
          }
      }
      
      cher@armor1:~/playground/Java/checkedStream$ javac CheckedStream.java 
      CheckedStream.java:13: error: incompatible thrown types ClassNotFoundException in method reference
              return names.map(Class::forName);
                               ^
      1 error
      
      import java.io.IOException;
      interface Function<T, R, E extends Throwable> {
          // Declare you throw E, whatever that is.
          R apply(T t) throws E;
      }   
      
      interface Stream<T> {
          // Pass through E, whatever mapper defined for E.
          <R, E extends Throwable> Stream<R> map(Function<? super T, ? extends R, E> mapper) throws E;
      }   
      
      class Main {
          public static void main(final String... args) throws ClassNotFoundException {
              final Stream<String> s = null;
      
              // Works: E is ClassNotFoundException.
              s.map(Class::forName);
      
              // Works: E is RuntimeException (probably).
              s.map(Main::convertClass);
      
              // Works: E is ClassNotFoundException.
              s.map(Main::throwSome);
      
              // Doesn't work: E is Exception.
              s.map(Main::throwSomeMore);  // error: unreported exception Exception; must be caught or declared to be thrown
          }   
      
          public static Class convertClass(final String s) {
              return Main.class;
          }   
      
          static class FooException extends ClassNotFoundException {}
      
          static class BarException extends ClassNotFoundException {}
      
          public static Class throwSome(final String s) throws FooException, BarException {
              throw new FooException();
          }   
      
          public static Class throwSomeMore(final String s) throws ClassNotFoundException, IOException  {
              throw new FooException();
          }   
      }   
      
      import static com.github.fge.lambdas.functions.Functions.wrap;
      
      final ThrowingFunction<String, Class<?>> f = wrap(Class::forName);
      
      List<Class> classes =
          Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
                .map(f.orThrow(MyException.class))
                .collect(Collectors.toList());
      
      @FunctionalInterface
      public interface UseInstance<T, X extends Throwable> {
        void accept(T instance) throws X;
      }
      
      import java.io.FileWriter;
      import java.io.IOException;
      
      //lambda expressions and the execute around method (EAM) pattern to
      //manage resources
      
      public class FileWriterEAM  {
        private final FileWriter writer;
      
        private FileWriterEAM(final String fileName) throws IOException {
          writer = new FileWriter(fileName);
        }
        private void close() throws IOException {
          System.out.println("close called automatically...");
          writer.close();
        }
        public void writeStuff(final String message) throws IOException {
          writer.write(message);
        }
        //...
      
        public static void use(final String fileName, final UseInstance<FileWriterEAM, IOException> block) throws IOException {
      
          final FileWriterEAM writerEAM = new FileWriterEAM(fileName);    
          try {
            block.accept(writerEAM);
          } finally {
            writerEAM.close();
          }
        }
      
        public static void main(final String[] args) throws IOException {
      
          FileWriterEAM.use("eam.txt", writerEAM -> writerEAM.writeStuff("sweet"));
      
          FileWriterEAM.use("eam2.txt", writerEAM -> {
              writerEAM.writeStuff("how");
              writerEAM.writeStuff("sweet");      
            });
      
          FileWriterEAM.use("eam3.txt", FileWriterEAM::writeIt);     
      
        }
      
      
       void writeIt() throws IOException{
           this.writeStuff("How ");
           this.writeStuff("sweet ");
           this.writeStuff("it is");
      
       }
      
      }
      
      public final class LambdaExceptionUtil {
      
          @FunctionalInterface
          public interface Consumer_WithExceptions<T, E extends Exception> {
              void accept(T t) throws E;
          }
      
          @FunctionalInterface
          public interface Function_WithExceptions<T, R, E extends Exception> {
              R apply(T t) throws E;
          }
      
          /**
           * .forEach(rethrowConsumer(name -> System.out.println(Class.forName(name))));
           */
          public static <T, E extends Exception> Consumer<T> rethrowConsumer(Consumer_WithExceptions<T, E> consumer) throws E {
              return t -> {
                  try {
                      consumer.accept(t);
                  } catch (Exception exception) {
                      throwActualException(exception);
                  }
              };
          }
      
          /**
           * .map(rethrowFunction(name -> Class.forName(name))) or .map(rethrowFunction(Class::forName))
           */
          public static <T, R, E extends Exception> Function<T, R> rethrowFunction(Function_WithExceptions<T, R, E> function) throws E  {
              return t -> {
                  try {
                      return function.apply(t);
                  } catch (Exception exception) {
                      throwActualException(exception);
                      return null;
                  }
              };
          }
      
          @SuppressWarnings("unchecked")
          private static <E extends Exception> void throwActualException(Exception exception) throws E {
              throw (E) exception;
          }
      
      }
      
      public class LambdaExceptionUtilTest {
      
          @Test(expected = MyTestException.class)
          public void testConsumer() throws MyTestException {
              Stream.of((String)null).forEach(rethrowConsumer(s -> checkValue(s)));
          }
      
          private void checkValue(String value) throws MyTestException {
              if(value==null) {
                  throw new MyTestException();
              }
          }
      
          private class MyTestException extends Exception { }
      
          @Test
          public void testConsumerRaisingExceptionInTheMiddle() {
              MyLongAccumulator accumulator = new MyLongAccumulator();
              try {
                  Stream.of(2L, 3L, 4L, null, 5L).forEach(rethrowConsumer(s -> accumulator.add(s)));
                  fail();
              } catch (MyTestException e) {
                  assertEquals(9L, accumulator.acc);
              }
          }
      
          private class MyLongAccumulator {
              private long acc = 0;
              public void add(Long value) throws MyTestException {
                  if(value==null) {
                      throw new MyTestException();
                  }
                  acc += value;
              }
          }
      
          @Test
          public void testFunction() throws MyTestException {
              List<Integer> sizes = Stream.of("ciao", "hello").<Integer>map(rethrowFunction(s -> transform(s))).collect(toList());
              assertEquals(2, sizes.size());
              assertEquals(4, sizes.get(0).intValue());
              assertEquals(5, sizes.get(1).intValue());
          }
      
          private Integer transform(String value) throws MyTestException {
              if(value==null) {
                  throw new MyTestException();
              }
              return value.length();
          }
      
          @Test(expected = MyTestException.class)
          public void testFunctionRaisingException() throws MyTestException {
              Stream.of("ciao", null, "hello").<Integer>map(rethrowFunction(s -> transform(s))).collect(toList());
          }
      
      }
      
      public List<Class> getClasses() throws ClassNotFoundException {     
          Stream<String> classNames = 
              Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String");
      
          return ThrowingStream.of(classNames, ClassNotFoundException.class)
                     .map(Class::forName)
                     .collect(Collectors.toList());
      }
      
          CompletableFuture<List<Class<?>>> classes =
                  Stream.of("java.lang.String", "java.lang.Integer", "java.lang.Double")
                        .map(MonadUtils.applyOrDie(Class::forName))
                        .map(cfc -> cfc.thenApply(Class::getSuperclass))
                        .collect(MonadUtils.cfCollector(ArrayList::new,
                                                        List::add,
                                                        (List<Class<?>> l1, List<Class<?>> l2) -> { l1.addAll(l2); return l1; },
                                                        x -> x));
          classes.thenAccept(System.out::println)
                 .exceptionally(t -> { System.out.println("unable to get class: " + t); return null; });
      
      [class java.lang.Object, class java.lang.Number, class java.lang.Number]
      
      Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
                .map(Try.<String, Class<?>>safe(Class::forName)
                        .handle(System.out::println)
                        .unsafe())
                .collect(toList());
      
      final class Try {
      
          public static <T> CheckedBuilder<Supplier<T>, CheckedSupplier<T>, T> 
              safe(CheckedSupplier<T> supplier) {
              return new CheckedWrapper<>(supplier, 
                      (current, next, handler, orResult) -> () -> {
                  try { return current.get(); } catch (Exception ex) {
                      handler.accept(ex);
                      return next.isPresent() ? next.get().get() : orResult.apply(ex);
                  }
              });
          }
      
          public static <T> Supplier<T> unsafe(CheckedSupplier<T> supplier) {
              return supplier;
          }
      
          public static <T> CheckedBuilder<Consumer<T>, CheckedConsumer<T>, Void> 
              safe(CheckedConsumer<T> consumer) {
              return new CheckedWrapper<>(consumer, 
                      (current, next, handler, orResult) -> t -> {
                  try { current.accept(t); } catch (Exception ex) {
                      handler.accept(ex);
                      if (next.isPresent()) {
                          next.get().accept(t);
                      } else {
                          orResult.apply(ex);
                      }
                  }
              });
          }
      
          public static <T> Consumer<T> unsafe(CheckedConsumer<T> consumer) {
              return consumer;
          }
      
          public static <T, R> CheckedBuilder<Function<T, R>, CheckedFunction<T, R>, R> 
              safe(CheckedFunction<T, R> function) {
              return new CheckedWrapper<>(function, 
                      (current, next, handler, orResult) -> t -> {
                  try { return current.applyUnsafe(t); } catch (Exception ex) {
                      handler.accept(ex);
                      return next.isPresent() ? next.get().apply(t) : orResult.apply(ex);
                  }
              });
          }
      
          public static <T, R> Function<T, R> unsafe(CheckedFunction<T, R> function) {
              return function;
          }
      
          @SuppressWarnings ("unchecked")
          static <T, E extends Throwable> T throwAsUnchecked(Throwable exception) throws E { 
              throw (E) exception; 
          }
      }
      
      @FunctionalInterface interface CheckedConsumer<T> extends Consumer<T> {
          void acceptUnsafe(T t) throws Exception;
          @Override default void accept(T t) {
              try { acceptUnsafe(t); } catch (Exception ex) {
                  Try.throwAsUnchecked(ex);
              }
          }
      }
      
      @FunctionalInterface interface CheckedFunction<T, R> extends Function<T, R> {
          R applyUnsafe(T t) throws Exception;
          @Override default R apply(T t) {
              try { return applyUnsafe(t); } catch (Exception ex) {
                  return Try.throwAsUnchecked(ex);
              }
          }
      }
      
      @FunctionalInterface interface CheckedSupplier<T> extends Supplier<T> {
          T getUnsafe() throws Exception;
          @Override default T get() {
              try { return getUnsafe(); } catch (Exception ex) {
                  return Try.throwAsUnchecked(ex);
              }
          }
      }
      
      interface ReduceFunction<TSafe, TUnsafe, R> {
          TSafe wrap(TUnsafe current, Optional<TSafe> next, 
                  Consumer<Throwable> handler, Function<Throwable, R> orResult);
      }
      
      interface CheckedBuilder<TSafe, TUnsafe, R> {
          CheckedBuilder<TSafe, TUnsafe, R> orTry(TUnsafe next);
      
          CheckedBuilder<TSafe, TUnsafe, R> handle(Consumer<Throwable> handler);
      
          <E extends Throwable> CheckedBuilder<TSafe, TUnsafe, R> handle(
                  Class<E> exceptionType, Consumer<E> handler);
      
          CheckedBuilder<TSafe, TUnsafe, R> handleLast(Consumer<Throwable> handler);
      
          <E extends Throwable> CheckedBuilder<TSafe, TUnsafe, R> handleLast(
                  Class<E> exceptionType, Consumer<? super E> handler);
      
          TSafe unsafe();
          TSafe rethrow(Function<Throwable, Exception> transformer);
          TSafe suppress();
          TSafe orElse(R value);
          TSafe orElseGet(Supplier<R> valueProvider);
      }
      
      final class CheckedWrapper<TSafe, TUnsafe, R> 
              implements CheckedBuilder<TSafe, TUnsafe, R> {
      
          private final TUnsafe function;
          private final ReduceFunction<TSafe, TUnsafe, R> reduceFunction;
      
          private final CheckedWrapper<TSafe, TUnsafe, R> root;
          private CheckedWrapper<TSafe, TUnsafe, R> next;
      
          private Consumer<Throwable> handlers = ex -> { };
          private Consumer<Throwable> lastHandlers = ex -> { };
      
          CheckedWrapper(TUnsafe function, 
                  ReduceFunction<TSafe, TUnsafe, R> reduceFunction) {
              this.function = function;
              this.reduceFunction = reduceFunction;
              this.root = this;
          }
      
          private CheckedWrapper(TUnsafe function, 
                  CheckedWrapper<TSafe, TUnsafe, R> prev) {
              this.function = function;
              this.reduceFunction = prev.reduceFunction;
              this.root = prev.root;
              prev.next = this;
          }
      
          @Override public CheckedBuilder<TSafe, TUnsafe, R> orTry(TUnsafe next) {
              return new CheckedWrapper<>(next, this);
          }
      
          @Override public CheckedBuilder<TSafe, TUnsafe, R> handle(
                  Consumer<Throwable> handler) {
              handlers = handlers.andThen(handler);
              return this;
          }
      
          @Override public <E extends Throwable> CheckedBuilder<TSafe, TUnsafe, R> 
              handle(Class<E> exceptionType, Consumer<E> handler) {
              handlers = handlers.andThen(ex -> {
                  if (exceptionType.isInstance(ex)) {
                      handler.accept(exceptionType.cast(ex));
                  }
              });
              return this;
          }
      
          @Override public CheckedBuilder<TSafe, TUnsafe, R> handleLast(
                  Consumer<Throwable> handler) {
              lastHandlers = lastHandlers.andThen(handler);
              return this;
          }
      
          @Override public <E extends Throwable> CheckedBuilder<TSafe, TUnsafe, R> 
              handleLast(Class<E> exceptionType, Consumer<? super E> handler) {
              lastHandlers = lastHandlers.andThen(ex -> {
                  if (exceptionType.isInstance(ex)) {
                      handler.accept(exceptionType.cast(ex));
                  }
              });
              return this;
          }
      
          @Override public TSafe unsafe() {
              return root.reduce(ex -> Try.throwAsUnchecked(ex));
          }
      
          @Override
          public TSafe rethrow(Function<Throwable, Exception> transformer) {
              return root.reduce(ex -> Try.throwAsUnchecked(transformer.apply(ex)));
          }
      
          @Override public TSafe suppress() {
              return root.reduce(ex -> null);
          }
      
          @Override public TSafe orElse(R value) {
              return root.reduce(ex -> value);
          }
      
          @Override public TSafe orElseGet(Supplier<R> valueProvider) {
              Objects.requireNonNull(valueProvider);
              return root.reduce(ex -> valueProvider.get());
          }
      
          private TSafe reduce(Function<Throwable, R> orResult) {
              return reduceFunction.wrap(function, 
                      Optional.ofNullable(next).map(p -> p.reduce(orResult)), 
                      this::handle, orResult);
          }
      
          private void handle(Throwable ex) {
              for (CheckedWrapper<TSafe, TUnsafe, R> current = this; 
                      current != null; 
                      current = current.next) {
                  current.handlers.accept(ex);
              }
              lastHandlers.accept(ex);
          }
      }
      
      public class CheckedExceptionWrapper extends RuntimeException {
          ...
          public <T extends Exception> CheckedExceptionWrapper rethrow() throws T {
              throw (T) getCause();
          }
      }
      
      void method() throws IOException, ServletException {
          try { 
              list.stream().forEach(object -> {
                  ...
                  throw new CheckedExceptionWrapper(e);
                  ...            
              });
          } catch (CheckedExceptionWrapper e){
              e.<IOException>rethrow();
              e.<ServletExcepion>rethrow();
          }
      }
      
      List test = new ArrayList();
              try {
                  test.forEach(obj -> {
      
                      //let say some functionality throws an exception
                      try {
                          throw new IOException("test");
                      }
                      catch(Exception e) {
                          throw new RuntimeException(e);
                      }
                  });
              }
              catch (RuntimeException re) {
                  if(re.getCause() instanceof IOException) {
                      //do your logic for catching checked
                  }
                  else 
                      throw re; // it might be that there is real runtime exception
              }
      
      // NoException
      stream.map(Exceptions.sneak().function(Class::forName));
      
      // jOOλ
      stream.map(Unchecked.function(Class::forName));
      
      // throwing-lambdas
      stream.map(Throwing.function(Class::forName).sneakyThrow());
      
      // Throwable interfaces
      stream.map(FunctionWithThrowable.aFunctionThatUnsafelyThrowsUnchecked(Class::forName));
      
      // Faux Pas
      stream.map(FauxPas.throwingFunction(Class::forName));
      
      public List<Class> getClasses() throws ClassNotFoundException {
          List<Class> classes;
          try {
              classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String").map(className -> {
                  try {
                      return Class.forName(className);
                  } catch (ClassNotFoundException e) {
                      throw new UndeclaredThrowableException(e);
                  }
              }).collect(Collectors.toList());
          } catch (UndeclaredThrowableException e) {
              if (e.getCause() instanceof ClassNotFoundException) {
                  throw (ClassNotFoundException) e.getCause();
              } else {
                  // this should never happen
                  throw new IllegalStateException(e.getMessage(), e);
              }
          }
          return classes;
      }
      
      interface CheckedFunction<I, O> {
          O apply(I i) throws Exception; }
      
      static <I, O> Function<I, O> unchecked(CheckedFunction<I, O> f) {
          return i -> {
              try {
                  return f.apply(i);
              } catch(Exception ex) {
      
                  throw new RuntimeException(ex);
              }
          } }
      
      fileNamesToRead.map(unchecked(file -> Files.readAllLines(file)))
      
      @SuppressWarnings("unchecked")
      private static <T, E extends Exception> T throwUnchecked(Exception e) throws E {
          throw (E) e;
      }
      
      static <I, O> Function<I, O> unchecked(CheckedFunction<I, O> f) {
          return arg -> {
              try {
                  return f.apply(arg);
              } catch(Exception ex) {
                  return throwUnchecked(ex);
              }
          };
      }
      
      public List<Class> getClasses() throws ClassNotFoundException {
          List<Class> classes =
              Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
                      .map(className -> getClass(className))
                      .collect(Collectors.toList());
          return classes;
      }
      
      @SneakyThrows                                 // <= this is the only new code
      private Class<?> getClass(String className) {
          return Class.forName(className);
      }
      
      private void run() {
          List<String> list = Stream.of(1, 2, 3, 4).map(wrapper(i ->
                  String.valueOf(++i / 0), i -> String.valueOf(++i))).collect(Collectors.toList());
          System.out.println(list.toString());
      }
      
      private <T, R, E extends Exception> Function<T, R> wrapper(ThrowingFunction<T, R, E> function, 
      Function<T, R> onException) {
          return i -> {
              try {
                  return function.apply(i);
              } catch (ArithmeticException e) {
                  System.out.println("Exception: " + i);
                  return onException.apply(i);
              } catch (Exception e) {
                  System.out.println("Other: " + i);
                  return onException.apply(i);
              }
          };
      }
      
      @FunctionalInterface
      interface ThrowingFunction<T, R, E extends Exception> {
          R apply(T t) throws E;
      }
      
          @Test
          public void getClasses() {
      
              String[] classNames = {"java.lang.Object", "java.lang.Integer", "java.lang.Foo"};
              List<Class> classes =
                      Stream.of(classNames)
                              .map(className -> {
                                  try {
                                      return Class.forName(className);
                                  } catch (ClassNotFoundException e) {
                                      // log the error
                                      return null;
                                  }
                              })
                              .filter(c -> c != null)
                              .collect(Collectors.toList());
      
              if (classes.size() != classNames.length) {
                  // add your error handling here if needed or process only the resulting list
                  System.out.println("Did not process all class names");
              }
      
              classes.forEach(System.out::println);
          }