source

Java에서 null-return 메서드를 Scala 옵션과 함께 래핑하시겠습니까?

manycodes 2022. 10. 26. 21:11
반응형

Java에서 null-return 메서드를 Scala 옵션과 함께 래핑하시겠습니까?

나에게 방법이 있다고 가정하자.session.get(str: String): StringJava에서 온 것이기 때문에 문자열이 반환될지 눌이 반환될지는 알 수 없습니다.

이 문제를 스칼라에서 해결할 수 있는 더 쉬운 방법은 없을까?session.get("foo") == null마법이 적용될지도 몰라ToOption(session.get("foo"))그리고 스칼라로 대할 수 있어

ToOption(session.get("foo")) match {
    case Some(_) =>;
    case None =>;
}

Option동반 객체의applymethod는 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의 예외 없는 결과를 변환하면 일부...

scala> Try(null).toOption
res10: Option[Null] = Some(null)

...Try는 nullability 체크가 아니라 예외를 기능적으로 처리하는 방법이기 때문입니다.

[ Try to catch exception ](예외를 검출하기 위해 시도)를 사용하여 [Option](옵션)으로 변환하면 예외가 발생했을 경우에만 [None](없음)으로 표시됩니다.

scala> Try(1/0).toOption
res11: Option[Int] = None

시행에서 나온 값을 유지하려고 합니다.그것은 무효일 수 있다.

하지만 표준 lib가 때때로 꽤 혼란스러운 것도 사실이다.

scala> Try(null).toOption
res12: Option[Null] = Some(null)

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

이 동작은 약간 일관성이 없지만 Try와 Option의 의도된 사용을 반영하고 있습니다.

예외를 발생시킬 수 있는 표현에서 나오는 것은 무엇이든 얻으려고 하며 예외 자체에 대해서는 신경 쓰지 않습니다.

나올 수 있는 값은 null일 수 있습니다.toOption이 None을 지정하면 예외와 늘을 구분할 수 없습니다.그것은 그다지 좋지 않습니다.

독립 실행형에서는 옵션을 사용하여 무언가의 존재 여부를 캡슐화합니다.이 경우 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)

언급URL : https://stackoverflow.com/questions/4692506/wrapping-null-returning-method-in-java-with-option-in-scala

반응형