>source

특정 if 가드에 대해 None match에서만 특정 코드를 실행하는 더 우아한 스칼라 방식이 있습니까? 예를 들면 다음과 같습니다.

Option(someExternalCall(data)) match {
      case Some(_) => Some(_)
      case None if checkSomething() => throw new RuntimeException
      case None => None
    }

편집

여기에 대한 답변에서 제안한대로 코드는 다음과 같습니다.

 Option(someExternalCall(data))
    .getOrElse(
      if(checkSomething()) throw new RuntimeException 
      else None
    )

반품 Serializable 초기 코드에서 결과는 Option[Type] 그것이 제가 갖고 싶은 것이기도합니다.


  • 답변 # 1

    당신은 그것을 단순화 할 수 있습니다

    Option(someExternalCall(data)) match {
      case None if checkSomething() => throw new RuntimeException
      case v => v
    }
    
    

    또는 아마도 활용 tap 부작용을 위해

    import scala.util.chaining._
    someExternalCall(data)
      .tap { v => if (v.isEmpty && checkSomething()) throw new RuntimeException }
    
    

    그러나 대신 리팩토링을 제안했습니다. someExternalCall 이미 반환 Option 아마도

    /**
     * @throws java.lang.RuntimeException
     */
    def someExternalCall(data: Foo): Option[Bar] = ???
    
    

    참고 Option(someExternalCall(data)) 보고 None 만약 someExternalCall(data) 보고 null 때로는 Java API의 경우이지만 반환되지 않는 경우 null 아마 돌아와 SomeNone 직접

    scala> def f(): String = null
    def f(): String
    scala> Option(f())
    val res0: Option[String] = None
    
    

  • 이전 android - IN 연산자로 Enum 목록을 제공하는 룸 데이터베이스 쿼리 사용
  • 다음 flutter - 이 축소 막대를 내 Google지도에 표시하려면 어떻게해야합니까?