Как вернуть либо пустоту, либо строку с помощью vavr

У меня есть функция, которая ничего не должна возвращать (void) или String, если некоторые условия не выполняются.

Я пробую эту строчку Either.left (Void)

    private Either<Void,String> processOrReturnErrorMessage(){
        //Do something  and in some case return a message of failed conditions
        return Either.left(Void);
    }

person EFOE    schedule 28.08.2019    source источник
comment
Почему бы просто не вернуть пустую строку, если вы не хотите, чтобы ничего возвращалось?   -  person Nexevis    schedule 28.08.2019
comment
Если ситуации, в которых вы должны вернуть String, указывают на неудачную операцию, почему бы вам вместо этого не создать исключение? Это то, что они для   -  person JonK    schedule 28.08.2019
comment
Я использую vavr, чтобы не иметь дело с функциональным случаем с исключением. @Nexevis Вы правы, это вполне возможно. но факт в том, что я хочу использовать более структурированный способ, например, result.isLeft () или даже больше result.map   -  person EFOE    schedule 28.08.2019
comment
Стоит отметить, что Either не является Java, ее Scala или какой-либо другой библиотекой.   -  person Bonatti    schedule 28.08.2019
comment
Библиотека - это VAVR, как указано в заголовке и в теге.   -  person EFOE    schedule 28.08.2019


Ответы (1)


В vavr есть тип для этого, и он называется Option. Вы можете вернуть Option.none(), если ошибки нет, и вернуть Option.some(errorMessage) в случае ошибки.

Если вы все еще хотите использовать Either, я бы рекомендовал использовать левую сторону для ошибок и правую часть для значений (счастливый путь), потому что Either смещен вправо, поэтому методы map и flatMap действуют на Either, только если это правильное значение. В вашем случае, поскольку нет значения для возврата (т.е. пустота), вы можете использовать Either<String, Void> и вернуть Either.right(null) в случае успеха, поскольку null является единственным обитателем типа Void (null является обитателем всех непримитивных типов в Java, на данный момент, к сожалению).

Или вы можете ввести новый тип под названием Unit с одним жителем (то есть синглтоном), использовать Either<String, Unit> для вашего типа возврата и вернуть Either.right(Unit.instance()), чтобы сигнализировать об отсутствии значимого возвращаемого значения и избежать возврата null значений, потому что возвращать null значений некрасиво .

person Nándor Előd Fekete    schedule 28.08.2019