2012-06-20 2 views

답변

58

것은 약간 덜 간결 람다 구문을 사용하여 :

mystuff = mystuff.filter(x => (x.isX && x.name == "xyz")) 

당신은 스칼라 익명 함수 구문 here에 대한 자세한 내용을 찾을 수 있습니다

나는 이런 식으로 뭔가를 할 수 있습니다.

+1

이렇게하면 성능 오버 헤드가 제거됩니까? 최종 쿼리에서 이것이 올바르게 표현 된 것입니까? – zinking

4

일부 성능에 미치는 영향은 "mystuff에"이 무엇인지에 따라이있을 수 있지만, 당신은 항상 당신이 자주 여러 조건으로 필터링해야하는 경우 두 번

mystuff = mystuff.filter(_.isX).filter(_.name == "xyz") 
+0

이로 인해 전체 목록이 이중 반복됩니다. – squixy

+5

@squixy 다만 참고로, 그렇지 않습니다. 'filter'는 반복 중에 (예를 들어'map','fold' 등) 엘리먼트가 요청 될 때'filter' 함수가 다음에 적용되도록 콜렉션의 새로운 투영법 (또는 뷰)을 생성합니다. 요소가 반환되는지 확인합니다. – ThaDon

4

, 당신이 그들을 결합하는 방법을 정의 할 수 있습니다 필터링 할 수 있습니다 :

scala> (0 until 20) filter And(_ > 10, _ % 2 == 1) 
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19) 
: 여기

case class And[A](p1: A=>Boolean, p2: A=>Boolean) extends (A=>Boolean) { 
    def apply(a: A) = p1(a) && p2(a) 
} 

10보다 큰 경우에만 홀수 번호를 유지하기 위해 사용하는 방법입니다

동일한 방법으로 OrNot 개의 연결자를 쉽게 쓸 수 있습니다.