Java - Lambda exceptions

0

Cześć,

mam takie pytanie nie mogę tego nigdzie znaleźć,

otóż mamy taki przykładowy kod:

          try {
            List.of("elo", "elo123")
                    .stream()
                    .map(str -> {
                        //DO SOMETHING 
                        Files.writeString(Path.of(""), str); // IOEXCEPTION
                    })
        } catch (IOException exception) {
        }

Mimo ze wykonywanie map jest w try catchu, Intellij/Java nakazuje rowniez dodac try catch dla IOException w srodku funkcji map, dlaczego tak jest ? Jakie docs mile widziane.

1

Ponieważ w map tworzysz anonimowa funkcje interfejsu java.util.function.Function, Function ma jedna metodę

R apply(T t); 

Jak widzisz, w sygnaturze metody checked exception nie jest rzucany dalej (np throws Exception, throws Throwable czy throws IOException), dlatego ten wyjątek musisz obsłużyć wewnątrz niejawnie implementowanej metody apply

Co możesz zrobić:

  • Obsłużyć wyjątek w lambdzie (o co prosi Ciebie IDE)
  • napisać prosty wrapper który opakowuje wewnątrz lambdy IOException w UncheckedIOException i obsłużenie UncheckedIOException później. (wpisz w google "wrap exception in lambda expression", jest pelno przykładów)

BTW. Twój try catch nic nie łapie i nie ma żadnego sensu :P

0
pwntmaciek napisał(a):

Co możesz zrobić:

  • Obsłużyć wyjątek w lambdzie (o co prosi Ciebie IDE)
  • napisać prosty wrapper który opakowuje wewnątrz lambdy IOException w UncheckedIOException i obsłużenie UncheckedIOException później. (wpisz w google "wrap exception in lambda expression", jest pelno przykładów)

Opcja nr. 3 - skorzystać z gotowych bibliotek, które mają CheckedFunction.

Natomiast jakbym miał pisać coś swojego to dopisałbym obsługę czegoś a'la Try w CheckedFunction:

Tj.

public interface CheckedFunction<IN, OUT> extends Function<IN, Try<OUT>> {
  OUT applyUnsafe(IN value) throws Exception;

  @Override
  default Try<OUT> apply(IN value) {
    try {
      return Try.success(applyUnsafe(value));
    } catch (Exception e) {
      return Try.failure(e);
    }
  }
}

Puryści funkcyjni, którzy nie uznają Try mogą zamienić to na Either ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1