이것은 매우 오래된 주제이지만 좋은 주제입니다!
Try to Option의 비 예외 결과를 변환하면 Some이 발생한다는 것은 사실입니다.
scala> Try(null).toOption
res10: Option[Null] = Some(null)
... Try는 null 허용 여부 검사가 아니라 기능적으로 예외를 처리하는 방법이기 때문입니다.
Try를 사용하여 예외를 포착하고 편의를 위해 Option으로 변환하면 예외가 발생하는 경우에만 None이 표시됩니다.
scala> Try(1/0).toOption
res11: Option[Int] = None
Try에서 나오는 값을 유지하려고합니다. null 일 수 있습니다.
그러나 표준 lib가 때때로 매우 혼란 스럽다는 것도 사실입니다.
scala> Try(null).toOption
res12: Option[Null] = Some(null)
scala> Option(null)
res13: Option[Null] = None
이 동작은 약간 일관성이 없지만 Try 및 Option의 의도 된 사용을 반영합니다.
try를 사용하여 예외를 던질 수있는 표현식에서 나오는 모든 것을 가져 오며 예외 자체에 대해서는 신경 쓰지 않습니다.
나올 수있는 값은 null 일 수 있습니다. toOption이 None을 주면 예외와 null을 구별 할 수 없으며 그것은 예쁘지 않습니다!
독립형으로 Option을 사용하여 무언가의 존재 여부를 캡슐화합니다. 그래서이 경우 Some (null)은 None이고,이 경우에 null은 무언가의 부재를 나타 내기 때문에 의미가 있습니다. 여기에는 모호성이 없습니다.
.toOption이 Option ()과 동일 하지 않기 때문에 어떤 경우에도 참조 투명성이 깨지지 않는다는 점에 주목하는 것이 중요합니다.
예외 안전 과 null 안전을 모두 적용해야하고 코드가 실제로 null과 예외를 구분할 필요가 없다면 두 패러다임을 결합하면됩니다! 왜냐하면 그게 당신이 원하는 것이기 때문입니다.
한 가지 방법으로 할 수 있습니다 ...
scala> Try(Option(null)).getOrElse(None)
res23: Option[Null] = None
scala> Try(Option(3/0)).getOrElse(None)
res24: Option[Int] = None
scala> Try(Option(3)).getOrElse(None)
res25: Option[Int] = Some(3)
... 또는 다른 ...
scala> Try(Option(null)).toOption.flatten
res26: Option[Null] = None
scala> Try(Option(3/0)).toOption.flatten
res27: Option[Int] = None
scala> Try(Option(3)).toOption.flatten
res28: Option[Int] = Some(3)
... 또는 그들 중 말도 안되게 추한 다른 사람 ...
scala> Option(Try(null).getOrElse(null))
res29: Option[Null] = None
scala> Option(Try(3/0).getOrElse(null))
res30: Option[Any] = None
scala> Option(Try(3).getOrElse(null))
res31: Option[Any] = Some(3)