2011-04-21 5 views
27

:스칼라의 단일 명령문에서 null을 확인하는 방법은 무엇입니까? 내 스칼라 코드에서

getObject 유형 QueueObject의 개체를 반환하는 방법입니다
QueueManager.add(getObject) 

.

QueueObject를 추가하는 동안 응답이 null인지 확인할 수있는 방법이 있습니까? 나는 이것을 할 수 있다는 것을 알고있다 :

그러나 나는 들여 쓰기 수준을 추가하고 싶지 않다. 인라인을 수행하는 운영자가 있습니까?

감사합니다.

답변

57

시도가 스칼라 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를 호출 할 수 있습니다 (약간 혼란 스러울 수있는 Optionforeach를 호출 예를 들어) 표시 (당신이 '돈 경우지도 작업의 결과를 무시 것을 t)는 필요 :이 OptionNone 경우 아무것도하지 않으며, 그것은 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) 
10

대신 Option[QueueObject]을 반환하면 getObject.foreach { QueueManager.add }과 같은 구문을 사용할 수 있습니다. Option(getObject).foreach ...으로 바로 인라인으로 감쌀 수 있습니다. Option[QueueObject](null)None이기 때문입니다.

getObject ifNotNull (QueueManager.add(_)) 

내가 더 잘 읽고 찾을 : 나는 Option(getObject).foreach와 @ 벤 잭슨의 asnwer이 그 일을 선호하는 방법입니다 확신하지만

7

, 나는 내가 쓸 수있는 AnyRef 포주를 사용하려면.

그리고,보다 일반적인 방법으로, 가끔 쓰기 내가 Option 다루고있어 경우 ifSome와 ifNotNull를 교체
val returnVal = getObject ifNotNull { obj => 
    returnSomethingFrom(obj) 
} otherwise { 
    returnSomethingElse 
} 

.... 나는 옵션으로 처음 래핑 한 다음 패턴 매칭하는 것보다 더 명확하다는 것을 알았다.

(실시 들어 Implementing ifTrue, ifFalse, ifSome, ifNone, etc. in Scala to avoid if(...) and simple pattern matching 참조하고 Otherwise0/ Otherwise1 클래스.)

+2

이 좋아,하지만 당신은 if'이 /'else' (else'에 '이름 바꾸기'의 자신의 버전을 만들고 싶어하는 이유'otherwise' ...). 재미있는 연습이지만 실제로는 아무것도 얻지 못하며 코드를 다른 사람들이 읽을 때 혼란스럽게 만들 수 있습니다. – Jesper

+0

@Jesper 나는'getObject ifNotNull (QueueManager.add (_))'가'Option (getObject) .foreach (QueueManager.add (_))'보다 덜 혼동 스럽긴하지만 나는 일반적으로 동의한다. 'foreach'는 특히 여러 객체가 처리 될 수 있다고 생각하게 만드는 경향이 있으며, 실제로는 실제로 옵션 인 것을 알아 내기 위해 다시 스캔해야합니다. 'Option'이 그 메소드에 대해 잘 알려진 별칭을 가질 수 있다면 좋을 것입니다. –

+0

Philippe 네,'foreach '로 트릭을 좋아하지 않습니다.'Option'에서 사용하면 오해의 소지가 있습니다. 가장 간단한 방법은 보통의 'if'를 쓰는 것입니다. – Jesper

9
Option(getObject) foreach (QueueManager add) 
+2

멋지다. 나는'(QueueManager add _)'대신'(QueueManager add)'를 쓸 수 있다는 것을 깨닫지 못했다. – ebruchez

관련 문제