2017-10-05 2 views
3

와 케이스를 단순화 나는 다음과 같은 코드를 가지고 :스칼라 :의가 있다고 가정 해 봅시다 비교

val num = Future.successful(10) 

num map { 
    case n if n > 0 => // do something 
    case _    // do something 
} 

내 질문은 : 어떻게 든 case n if n > 0을 단순화 할 수 있습니까?

나는 내가 좋아하는 뭔가를 쓸 수있을 것으로 기대 :
case _ > 0 => // do something 

또는 명시 적으로 지정된 유형

(우리가 Future 유형 [Int] 추론 것을 알고 있지만) :

case _: Int > 0 => // do something 

이 코드는 어떻게 든 단순화 할 수 있습니다 ? 당신이 Future.collect을 가드를 유지하고 사용할 수 있습니다, 그렇지 않으면

val num = Future.successful(10).filter(_ > 0).map { nat => 
} 

: 당신이 경비를 단순화하려면

답변

2

case n if n > 0 => ...을 단순화 할 수 없습니다.

패턴 일치의 모든 사례 절에는 패턴과 (선택 사항) 보호이 있어야합니다.

구문 (_ > 0)은 람다에서만 유효하지만 case 절과 유사한 특수 구문은 없습니다.

+0

새로운 스칼라 버전에서 그런 것을 소개 할 수 있다고 생각합니까? –

+0

나는 이것이 지금까지의 제안이라고 생각하지 않지만 스팩 팀에 대해서는 말하지 않는다. 개인적인 견해로, 나는 스칼라에서 추가 된 것이 아닌 특별한 구문을 제거하고 싶다. –

+1

감사합니다, 가브리엘. 내가 원했던 모든 것은 그것을 단순화 할 방법이 없다는 것을 확인하는 것이다. –

2

, 당신은 Future 선험적으로 필터링 할 수 있습니다

val num = Future.successful(10).collect { 
    case n if n > 0 => // do something 
} 

하나 개 중요한 것은 것은 주목 부분 함수가 반환 된 값에 대해 정의되지 않은 경우 (즉, 사례 -1의 경우) 최종 결과는 Failure이고 NoSuchElementException이 포함됩니다.

위의 옵션 이외에 가드가 필요합니다. 나는 그것을 표현할 수있는 구문 론적으로 더 짧은 방법을 보지 못했다.

+0

첫 번째 변형은 적용 가능한 미래 결과의 경우에 뭔가를해야 할 경우 적용되지만 매핑 된 Future from 함수를 반환해야하는 경우에는 적용 할 수 없습니다. 내가 맞습니까? –

+0

@AndriiAbramov 나는 당신을 올바르게 이해한다면, 그렇습니다. 이 두 변종은 원래 미래를 반환하지 않을 것이기 때문입니다. –

관련 문제