0

Я пытаюсь понять причины разной семантики Option/Optional, возможно, в 3 наиболее используемых реализациях в экосистеме Java: Java 8, Functional Java и Guava.Различные семантики Option/Option в Java

Учитывая следующие три фрагмента.

  1. java.util.Optional.of(100).map(i -> null) Результаты Optional.empty.
  2. fj.data.Option.some(100).map(i -> null) Результаты Some(null).
  3. com.google.common.base.Optional.of(100).transform(i -> null) результаты NullPointerException.

В чем причина 3 выбора? Если это целесообразно, что можно считать наиболее «чистым» или «правильным» с точки зрения функционального программирования? Например, с точки зрения просмотра Option типа монады, что было бы наиболее правильным; или что можно считать наиболее сложным? Было бы также интересно узнать, как это обрабатывается на функциональных языках, которые допускают нули.

+0

Различной Цель кодирования (оптимизировать, безопасный или без аварии) Я думаю, вы должны прочитать, например, Java хорошая практика книги. Например, избегайте null при возврате списка, вы должны вернуть emptyList. Исключение должно оставаться как их имя, Исключения. – Destrif

+0

По той же причине, почему C# и Java не совсем равны. Различные разработчики с разными мнениями, как «это» должно работать. Спросить _us_ почему они так странно. – Tom

+1

@Tom немного расширил вопрос, чтобы быть более конкретным – hgrey

ответ

1

Я не вижу реальной причины поведения Гуавы. Что же касается двух других, это зависит от того, как автор определяется нулевые значения:

  • Java 8, определенные null значение является отсутствие значения, таким образом, вы получаете функциональный Java Optional.empty
  • , казалось, определили null, как возможное значение, отличное от значения.

    Для более конкретной причины, давайте взглянем на map определение:

    public final <B> Option<B> map(final F<A, B> f) { 
        return isSome() ? some(f.f(some())) : Option.none(); 
    } 
    

    Пока «контейнер» не None, его преобразованное значение не будет None. Чтобы получить результат, похожий на java 8, можно использовать fromNull.

Что касается «чистого» или «правильного», вероятно, подобного ответа на старую is 0 a natural number? :)

Смежные вопросы