Java의 null 반환 메서드를 Scala의 Option으로 래핑합니까?


107

메서드가 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 =>;
}

4
더 많은 옵션 트릭을 참조 blog.tmorris.net/scalaoption-cheat-sheet
Landei

답변:


182

Option동반자 개체의 apply방법은 널 (NULL) 참조에서 변환 기능의 역할 :

scala> Option(null)
res4: Option[Null] = None

scala> Option(3)   
res5: Option[Int] = Some(3)

19

Option객체는이 apply정확하게 수행 방법 :

var myOptionalString = Option(session.get("foo"));

5

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

1
나는 스칼라 2.11.8로 달렸다. 두 번째 줄에서 NullPointerException이 발생했습니다. 여섯 번째 줄에는 예상대로 None이 아닌 Some (null)이 있습니다.
John Lin

1. optionString에서 Option 대신 Some 사용-원래 답변에서 변경되었습니다. 2. Scala
2.12.5

-3

이것은 매우 오래된 주제이지만 좋은 주제입니다!

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.