2014-02-22 2 views
2

단일 항목을 동일한 옵션으로 반환해야하는 반복자를 변환하려고 시도했습니다.scala에서 변환하는 방법 Iterator [T] to Option [T]

내가 할 수있는 최선책은 이것이었다. 표준 API에서 뭔가 사용해야합니까? 이 효율적으로 또는 중단을 보장하지 않기 때문에

def toUniqueOption[T](a: Iterator[T]): Option[T] = 
    if (a.size > 1) 
     throw new RuntimeException("The iterator should be emtpy or contain a single item but contained ${a.size} items.") 
    else if (a.size > 0) 
     Option(a.toList(0)) 
    else 
     Option.empty 
+0

그것은 정말 로직을 표현하는 예외를 사용하는 것은 좋지 않다. 'Type [String, Option [T]]를 대신 생각해보십시오. –

+0

좋은 아이디어. Try [T]를 사용하려고 시도 할 것입니다 .Option [T] – raisercostin

답변

9

size를 호출하는 것은 위험합니다.

방법에 대해 :

def toUniqueOption[T](a: Iterator[T]): Option[T] = 
    a.take(2).toList match { 
    case Nil => None 
    case x :: Nil => Some(x) 
    case _ => throw new RuntimeException("Iterator size > 1") 
    } 
3
당신은 hasNextnext를 사용하여 전체 시퀀스를 반복 피할 수

:

def toUniqueOption[T](a: Iterator[T]): Option[T] = { 
    if(a.hasNext) { 
     val f = a.next() 
     if(a.hasNext) throw new RuntimeException("Iterator should contain at most one element") 
     Some(f) 
    } 
    else None 
} 
0

을하지 정확하게 요청, 그런데 왜 같은 것을 사용하지 무엇을 :

def nextAsOption[T](i: Iterator[T]) : Option[T] = { 
    i.hasNext match { 
     case true => Some(i.next) 
     case false => None 
    } 
    } 

이것은 Iterator "다음"연산 th를 제공합니다. at는 Boolean 대신 Option을 반환합니다. 옵션을 전달해야 할 때 매우 편리합니다.

+1

if (i.hasNext) Some (i.next) else None' 왜 안되나요? – Derecho

+0

필자가 아는 한, 컴파일러 최적화에 관해서는 정확히 동일하다. – matanster

5

당신은 실제로 표준 API를 사용할 수 있습니다

a.toStream.headOption 

어디 : 반복자 [T]

관련 문제