시도가 스칼라 null
를 사용하지. 실제로 Java와의 상호 운용성을 위해서만 존재합니다. 스칼라에서는 비어있는 항목에 Option
을 사용합니다. null
을 반환하는 Java API 메소드를 호출하는 경우 Option
에 즉시 래핑하십시오.
def getObject : Option[QueueObject] = {
// Wrap the Java result in an Option (this will become a Some or a None)
Option(someJavaObject.getResponse)
}
참고 : val
에 넣어 또는 스칼라에서 명시 적 return
문을 사용할 필요가 없습니다; 결과는 블록의 마지막 표현 인 의 값이됩니다. 사실 하나의 명령문 만 있기 때문에 블록이 필요하지 않습니다.
def getObject : Option[QueueObject] = Option(someJavaObject.getResponse)
게다가 다른 사람은 이미 당신은 또한에 map
를 호출 할 수 있습니다 (약간 혼란 스러울 수있는 Option
에 foreach
를 호출 예를 들어) 표시 (당신이 '돈 경우지도 작업의 결과를 무시 것을 t)는 필요 :이 Option
가 None
경우 아무것도하지 않으며, 그것은 Some
경우 QueueManager.add
를 호출합니다
getObject map QueueManager.add
.
들여 쓰기 수준을 피하기 위해 이러한 "트릭"중 하나를 사용하는 것보다 명확하고 단순한 if
을 사용합니다. 벤이 옳다,하지 않도록주의 -
if (getObject != null) QueueManager.add(getObject)
편집 : 당신이 대신 Option
를 사용하는 null
처리하려는 경우,
if (getObject.isDefined) QueueManager.add(getObject.get)
나 : 당신은 또한 단지 한 줄에 쓸 수 부작용이있을 경우 getObject
번 이상 호출하십시오. 더 나은이 같은 쓰기를 :
val result = getObject
if (result.isDefined) QueueManager.add(result.get)
나 :
val result = getObject
if (result != null) QueueManager.add(result)
이 좋아,하지만 당신은 if'이 /'else' (else'에 '이름 바꾸기'의 자신의 버전을 만들고 싶어하는 이유'otherwise' ...). 재미있는 연습이지만 실제로는 아무것도 얻지 못하며 코드를 다른 사람들이 읽을 때 혼란스럽게 만들 수 있습니다. – Jesper
@Jesper 나는'getObject ifNotNull (QueueManager.add (_))'가'Option (getObject) .foreach (QueueManager.add (_))'보다 덜 혼동 스럽긴하지만 나는 일반적으로 동의한다. 'foreach'는 특히 여러 객체가 처리 될 수 있다고 생각하게 만드는 경향이 있으며, 실제로는 실제로 옵션 인 것을 알아 내기 위해 다시 스캔해야합니다. 'Option'이 그 메소드에 대해 잘 알려진 별칭을 가질 수 있다면 좋을 것입니다. –
Philippe 네,'foreach '로 트릭을 좋아하지 않습니다.'Option'에서 사용하면 오해의 소지가 있습니다. 가장 간단한 방법은 보통의 'if'를 쓰는 것입니다. – Jesper