복붙노트

[SCALA] 대신 필터 withFilter

SCALA

대신 필터 withFilter

대신 필터의 withFilter 사용하는 것이 더 확대됨에 항상, 나중에지도와 같은 기능을 적용 할 때, flatmap 등?

왜 전용 맵, flatmap 및 foreach 문이 지원됩니까? (FORALL 같은 예상 기능 /뿐만 아니라 존재)

해결법

  1. ==============================

    1.스칼라 문서에서 :

    스칼라 문서에서 :

    따라서 필터는 원래의 집합을 새로운 집합을 생성하지만 withFilter 비 엄격하게 (즉 느리게)이 (필터링) 컬렉션을 통해 두 번째 패스를 저장 후술지도 / flatMap / withFilter 통화를 통해 필터링되지 않은 값을 통과 할 것이다. 이 이후의 메서드 호출을 통과 할 때 따라서 것이 더 효율적입니다.

    사실, withFilter 특별히 이해에 대한이로 해제 설탕 무엇이며 이러한 방법의 체인 작업을 위해 설계되었습니다. 다른 방법 (예 : FORALL / 존재와 같은)이 필요하지 않습니다, 그래서 그들은 withFilter의 FilterMonadic 반환 형식에 추가되지 않았습니다.

  2. ==============================

    2.어둠의 땅의 우수한 답변 또한, 나는 필터와 withFilter의 차이의 직관적 인 예제를 가지고 싶습니다.

    어둠의 땅의 우수한 답변 또한, 나는 필터와 withFilter의 차이의 직관적 인 예제를 가지고 싶습니다.

    의 다음 코드를 살펴 보자

    val list = List(1, 2, 3)
    var go = true
    val result = for(i <- list; if(go)) yield {
       go = false
       i
    }
    

    대부분의 사람들은 (1) 목록에 동일하게 결과를 기대합니다. 에 대한-이해가로 번역되어 있기 때문 스칼라 2.8 이후의 경우

    val result = list withFilter {
      case i => go
    } map {
      case i => {
        go = false
        i
      }
    }
    

    당신이 볼 수 있듯이 번역은 withFilter에 전화로 상태를 변환합니다. 이전 스칼라 2.8에 대한-이해 다음과 같은 무언가로 번역되었다 :

    val r2 = list filter {
      case i => go
    } map {
      case i => {
        go = false
        i
      }
    }
    

    필터를 사용하여, 결과 값이 상당히 다를 것이다리스트 (1, 2, 3). 필터가 이미 완료되어 있기 때문에 우리는 이동 플래그가 false 제작하고 있다는 사실은 필터에 영향을주지 않습니다. 또, 스칼라 2.8에이 문제가 withFilter를 사용하여 해결된다. withFilter가 사용되는 경우, 상태는 소자는지도에있어서의 내부에 액세스 할 때마다 평가된다.

    참고:   - P.120는 스칼라 작업에서, 매닝 간행물, Milanjan Raychaudhuri (스칼라 2.10 커버)   - 대한 - 이해 번역에 대한 Odersky의 생각

  3. ==============================

    3.FORALL /가 구현되지 않은 존재하기 때문에 주요 이유는 사용 사례가 있다는 것이다 :

    FORALL /가 구현되지 않은 존재하기 때문에 주요 이유는 사용 사례가 있다는 것이다 :

    게으름을 잃고, 우리는 모든 요소를 ​​얻을 필요가있는 FORALL / 구현합니다.

    그래서 예를 들면 :

    import scala.collection.AbstractIterator
    
    class RandomIntIterator extends AbstractIterator[Int] {
      val rand = new java.util.Random
      def next: Int = rand.nextInt()
      def hasNext: Boolean = true
    }
    
    //rand_integers  is an infinite random integers iterator
    val rand_integers = new RandomIntIterator
    
    val rand_naturals = 
        rand_integers.withFilter(_ > 0)
    
    val rand_even_naturals = 
        rand_naturals.withFilter(_ % 2 == 0)
    
    println(rand_even_naturals.map(identity).take(10).toList)
    
    //calling a second time we get
    //another ten-tuple of random even naturals
    println(rand_even_naturals.map(identity).take(10).toList)
    

    ten_rand_even_naturals 여전히 반복자입니다 있습니다. 우리는 임의의 숫자 toList 호출 할 경우에만 생성 체인에서 필터링됩니다

    매핑 동등 (I => Ⅰ)가 원래 형태로 돌아 withFilter 객체로 변환하기 위해 여기에서 사용되는 맵 (신원) 주 (예 컬렉션 스트림, 반복자)

  4. ==============================

    4.FORALL를 들어 / 부분이 존재한다 :

    FORALL를 들어 / 부분이 존재한다 :

    someList.filter(conditionA).forall(conditionB)
    

    동일 할 것 같은 (조금 않은 직관적 인 생각)

    !someList.exists(conditionA && !conditionB)
    

    마찬가지로 .filter는 (). () 검사 존재 하나에 결합 될 수있다 존재?

  5. ==============================

    5.수율 사용하면 예를 들어 주위에 작업 할 수 있습니다 :

    수율 사용하면 예를 들어 주위에 작업 할 수 있습니다 :

    for {
      e <- col;
      if e isNotEmpty
    } yield e.get(0)
    
  6. ==============================

    6.해결 방법으로, 당신은 단지지도와 flatMap 다른 기능을 구현할 수 있습니다.

    해결 방법으로, 당신은 단지지도와 flatMap 다른 기능을 구현할 수 있습니다.

    또한,이 최적화는 작은 컬렉션에 쓸모가 ...

  7. from https://stackoverflow.com/questions/19617378/withfilter-instead-of-filter by cc-by-sa and MIT license