рдЬрд╛рд╡рд╛ рдореЗрдВ рдлрдВрдХреНрд╢рдирд▓ рд╕реНрдЯрд╛рдЗрд▓ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ

рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рд╕реНрддреНрд░реАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рднреА рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рддреБрд░рдВрдд рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕ рдкрд░ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрд╢рд┐рд╢ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

def inputStreamForURL(url: String): Try[Try[Try[InputStream]]] = parseURL(url).map { u => Try(u.openConnection()).map(conn => Try(conn.getInputStream)) } 

рдЬрд╛рд╡рд╛ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рд╡рд╛рд╡рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

 Try.of(() -> u.openConnection()).getOrElse(other); 

рдЬрд╛рд╡рд╛ 8 рдореЗрдВ, рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╢реВрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЕрд╢рдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред

рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд╕рдорд╛рди рдПрдХ рд╡рд░реНрдЧ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдЧреИрд░-рдкрд░рд╕реНрдкрд░ рднреА рд╣реИред

 public final class Expected<T, E extends Throwable> { private final T value; private final E error; private Expected() { this.value = null; this.error = null; } private Expected(T value) { this.value = Objects.requireNonNull(value); this.error = null; } private Expected(E error) { this.error = Objects.requireNonNull(error); this.value = null; } public static <T, E extends Throwable> Expected<T, E> of(T value) { return new Expected<>(value); } public static <T, E extends Throwable> Expected<T, E> of(E error) { return new Expected<>(error); } public static <T, E extends Throwable> Expected<T, E> of(Supplier<T> supplier) { try { return new Expected<>(supplier.get()); } catch (Throwable e) { return new Expected<>((E) e); } } public boolean isValue() { return value != null; } public boolean isError() { return error != null; } public T value() { return value; } public E error() { return error; } } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВ, рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЖрдЧрдВрддреБрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

 Expected<Integer, SQLException> data = Expected.of(new SQLException()); matches(data, Expected::error, e -> out.println("get error: " + e), Expected::value, v -> out.println("get value: " + v) ); Expected<Integer, ArithmeticException> expression = Expected.of(() -> 4 / 0); matches(expression, Expected::error, e -> out.println("get error: " + e), Expected::value, v -> out.println("get value: " + v) ); 

 public static <T, E extends Throwable> void matches(Expected<T, E> value, Function<Expected<T, E>, E> firstFunction, Consumer<E> firstBranch, Function<Expected<T, E>, T> secondFunction, Consumer<T> secondBranch) { if (value.isError()) { E arg = firstFunction.apply(value); firstBranch.accept(arg); } else { T arg = secondFunction.apply(value); secondBranch.accept(arg); } } 

C ++ 23 рдореЗрдВ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд░реНрдЧ рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред

рдРрд╕реА рдХрдХреНрд╖рд╛ рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрдВрдкрдиреА рдХрд╛ рдЧрдарди рдХрд░ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рдЗрд╕ рд╕рдордп, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк Vavr рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрдореНрдореАрдж рдХреА рд╕рдорд╛рдирддрд╛ рдореЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдХрдХреНрд╖рд╛ рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб github: рд▓рд┐рдВрдХ рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi469329/


All Articles