Source:How to use Jackson to deserialise an array of objects
public interface ThrowableFunction<A, B> {
    B apply(A a) throws Exception;
}
public abstract class Try<A> {
    public static boolean isSuccess(Try tryy) {
        return tryy instanceof Success;
    }
    public static <A, B> Function<A, Try<B>> tryOf(ThrowableFunction<A, B> function) {
        return a -> {
            try {
                B result = function.apply(a);
                return new Success<B>(result);
            } catch (Exception e) {
                return new Failure<>(e);
            }
        };
    }
    public abstract boolean isSuccess();
    public boolean isError() {
        return !isSuccess();
    }
    public abstract A getResult();
    public abstract Exception getError();
}
public class Success<A> extends Try<A> {
    private final A result;
    public Success(A result) {
        this.result = result;
    }
    @Override
    public boolean isSuccess() {
        return true;
    }
    @Override
    public A getResult() {
        return result;
    }
    @Override
    public Exception getError() {
        return new UnsupportedOperationException();
    }
    @Override
    public boolean equals(Object that) {
        if(!(that instanceof Success)) {
            return false;
        }
        return Objects.equal(result, ((Success) that).getResult());
    }
}
public class Failure<A> extends Try<A> {
    private final Exception exception;
    public Failure(Exception exception) {
        this.exception = exception;
    }
    @Override
    public boolean isSuccess() {
        return false;
    }
    @Override
    public A getResult() {
        throw new UnsupportedOperationException();
    }
    @Override
    public Exception getError() {
        return exception;
    }
}

