Java의 null 반환 메서드를 Scala의 Option으로 래핑합니까?
메서드가 session.get(str: String): String
있지만 Java에서 가져 오기 때문에 문자열 또는 null을 반환할지 여부를 모른다고 가정합니다.
대신 Scala에서 이것을 처리하는 더 쉬운 방법이 session.get("foo") == null
있습니까? 마법이 적용 ToOption(session.get("foo"))
되면 스칼라 방식으로 처리 할 수 있습니다.
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
Option
동반자 개체의 apply
방법은 널 (NULL) 참조에서 변환 기능의 역할 :
scala> Option(null)
res4: Option[Null] = None
scala> Option(3)
res5: Option[Int] = Some(3)
Option
객체는이 apply
정확하게 수행 방법 :
var myOptionalString = Option(session.get("foo"));
Java 객체로 작업 할 때 예상대로 작동하지 않습니다.
val nullValueInteger : java.lang.Integer = null
val option: Option[Int] = Option(nullValueInteger)
println(option) // Doesn't work - zero value on conversion
val nullStringValue : String = null
val optionString: Option[String] = Option(nullStringValue)
println(optionString) // Works - None value
이것은 매우 오래된 주제이지만 좋은 주제입니다!
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)
'programing' 카테고리의 다른 글
어디에서 isset () 및! empty ()를 사용해야합니까? (0) | 2020.09.03 |
---|---|
C ++에서 함수 이름에 별칭을 어떻게 할당합니까? (0) | 2020.09.03 |
Android의 runOnUiThread 대 Looper.getMainLooper (). post (0) | 2020.09.03 |
문자열에서 영숫자가 아닌 문자를 제거하고 공백을 유지하려면 어떻게합니까? (0) | 2020.09.03 |
더 이상 사용되지 않음 : mysql_connect () (0) | 2020.09.03 |