LINUX.ORG.RU

как хранить null в optional

 


0

3

как в Optional кошерно хранить null?

допустим есть функция, результат которой может не вычислиться (например, рефлекшеновое Field.get выдаст экзепшен), и чтобы отразить этот факт хочется Optional

но функция вполне может вернуть null. Optional.of(null) вернет экзепшен в requireNonNull.

можно сделать Optional.of(Optional.ofNullable(null)), но это выглядит неприятно, а парсить результат этого еще неприятней - паттернматчинга-то не завезли

как сделать это красиво?

★★★★☆

может завернуть результат функции в некий класс типа

class FuncResult {
   public enum TYPE {
      JustNull,
      Ok,
      Exception
   };
   public TYPE type;
   public Object value;
}
?

bvn13 ★★★★★
()
Последнее исправление: bvn13 (всего исправлений: 1)

Optional плохо подходит для индикации наличия ошибки. В Scala есть Try и Either, можно попробовать в java что-то такое изобразить.

maxcom ★★★★★
()
Ответ на: комментарий от anonymous

Человек хочет сумму, а ты ему произведение предлагаешь.

anonymous
()

Тупо – Optional<Optional<T>>. Или Optional<Result<T>> где class Result<T> { final T value; }

Нормально – сделать «свой Optional», который допускает нулевые значения.

Legioner ★★★★★
()
Ответ на: комментарий от bvn13

Какой смысл в JustNull? Если функция возвращает null, он прекрасно представим в виде value == null && type == Ok.

Legioner ★★★★★
()

Тебе нужен аналог Either/Choice

buddhist ★★★★★
()

Устроили тут haskell.

anonymous
()
Ответ на: комментарий от maxcom

да, похоже придется своё юзать.

еще вопрос. Есть кусок кода, засунутый в лямбду, и он кидает исключение.

сейчас я весь такой код обворачиваю обертками, чтобы никаких исключений не было, но от этого как-то неуютно.

какой кошерный способ для Java в рамках лямбд, и особенно stream api, работать с исключениями? Может их как-то можно удобно перебрасывать?

stevejobs ★★★★☆
() автор топика

Try же, балбес!

anonymous
()
Ответ на: комментарий от stevejobs

удобно? оборачивай все в рантайм ексепшон :D

anonymous
()

Мне кажется, что вместо того, чтоб использовать преимущества Optional вы пытаетесь использовать их как обычные объекты.

bogus_result
()
Ответ на: комментарий от maxcom

а как в скаловском синтаксисе записывается такое?

list.map(element -> функция_которая_может_не_вычислиться(element)).filter(только_то_что_вычислилось).toList() ?

т.е. полностью «плоский» синтаксис?

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs
scala> import util.Try; List(Try[String] { throw new Exception }, Try { "jobs jiv!" }).map(_.toOption).flatten
import util.Try
res0: List[String] = List(jobs jiv!)

scala> import util.Try; List(Try[String] { throw new Exception }, Try { "jobs jiv!" }).filter(_.isSuccess)
import util.Try
res1: List[scala.util.Try[String]] = List(Success(jobs jiv!))
anonymous
()
Ответ на: комментарий от anonymous

спасибо, да, в шкале это работает. И даже Try{null} работает. Теперь завести бы того же самого в джаву8..

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Так в джаве ж почти то же самое можно? На гитхабе даже гистов с `MyTry<T>` навалом.

anonymous
()
Ответ на: комментарий от stevejobs

Предлагаю вот такие варианты:

scala> Seq(1,2,3).map(Try(_)).collect{ case Success(v) => v }
res3: Seq[Int] = List(1, 2, 3)

scala> Seq(1,2,3).map(Try(_)).flatMap(_.toOption)
res4: Seq[Int] = List(1, 2, 3)

функцию нужно вставить в вызов Try.

maxcom ★★★★★
()
Ответ на: комментарий от Legioner

Да что уж там, у нас иногда с помощью исключений управляют потоком исполнения программы :(

anonymous
()
Ответ на: комментарий от Legioner

Временно сделал по-тупому с Result<T>. Попробовал юзать, жить можно.

stevejobs ★★★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.