Daniel의 답변 외에도 Stream
은 단락 평가에 유용합니다.예를 들어, 내가 String
을 가지고 Option[String]
을 반환하는 함수의 거대한 세트를 가지고 가정, 그 중 하나가 작동 할 때까지 내가 그들을 실행을 유지하려면 :
val stringOps = List(
(s:String) => if (s.length>10) Some(s.length.toString) else None ,
(s:String) => if (s.length==0) Some("empty") else None ,
(s:String) => if (s.indexOf(" ")>=0) Some(s.trim) else None
);
글쎄, 나는 확실히 을 실행하지 않으려는 전체 목록에 있으며, List
에 "기능으로 처리하고 실행 중 하나가 None
이 아닌 다른 값을 반환 할 때까지 실행하는 방법"이 없습니다. 무엇을해야합니까? 아마도이 :
이 목록을 소요하고 (실제로는 아무것도 평가하지 않는), 다음 기능을 적용한 결과 인 새로운
Stream
을 정의 (하지만이 평가하지 않는
Stream
로 취급
def transform(input: String, ops: List[String=>Option[String]]) = {
ops.toStream.map(_(input)).find(_ isDefined).getOrElse(None)
}
무엇이든 아직은) 정의 된 첫 번째 항목을 검색합니다. 여기서는 마술처럼 다시 돌아가서지도를 적용하고 원래 목록에서 올바른 데이터를 가져와야한다고 인식하고 Option[Option[String]]
에서 언랩합니다 getOrElse
을 사용하여 Option[String]
으로 변경하십시오. 여기
은 예입니다 :
scala> transform("This is a really long string",stringOps)
res0: Option[String] = Some(28)
scala> transform("",stringOps)
res1: Option[String] = Some(empty)
scala> transform(" hi ",stringOps)
res2: Option[String] = Some(hi)
scala> transform("no-match",stringOps)
res3: Option[String] = None
그러나 그것은 작동합니까? 2.7의 구현은 종종 하나 오버 슈트, 불행하게도 당신이주의 것입니다. 우리는 우리의 기능으로 println
을 넣으면 그래서 우리는 그들이 호출하는 경우, 우리는 (이 스칼라 2.8 함께
val stringOps = List(
(s:String) => {println("1"); if (s.length>10) Some(s.length.toString) else None },
(s:String) => {println("2"); if (s.length==0) Some("empty") else None },
(s:String) => {println("3"); if (s.indexOf(" ")>=0) Some(s.trim) else None }
);
// (transform is the same)
scala> transform("This is a really long string",stringOps)
1
res0: Option[String] = Some(28)
scala> transform("no-match",stringOps)
1
2
3
res1: Option[String] = None
를 얻을 말할 수있다 은 오류가 발생으로이 None
의 긴 목록을 축적 할 수 있지만, 아마도이 여기 당신의 진정한 계산에 비해 저렴하다.)
내가 추가하고 싶은 또 다른 차이점은 '스트림'이 헤드 요소에서 결코 게으르지 않다는 것입니다. 'Stream'의 헤드는 평가 된 형태로 저장됩니다. 요청 될 때까지 요소 (머리 포함)가 계산되지 않는 시퀀스가 필요하다면 'Iterator'가 유일한 선택입니다. – Lii
헤드 요소에 게으름이 아니라, 드롭하려는 모든 요소를 평가합니다. 예 :''a "# :"b "# :"c "# :"d "# : Stream.empy [문자열] .drop (3)'은"a ","b " c "와"d ". 머리가되기 때문에 "d". – r90t
소수 생성기에 대한 흥미로운 간결한 예.흥미롭게도, 간단한 스칼라 콘솔에서 생성 한 다음 4000 소수를 요구하면 (실제로는 그리 많지 않지만 2 초 내에 100K를 생성하는 대체 정의가 있음) "GC 오버 헤드 한도를 초과했습니다"오류가 발생하여 Scala가 충돌합니다 . –