복붙노트

[SCALA] 스칼라 2.8 컬렉션 디자인 자습서

SCALA

스칼라 2.8 컬렉션 디자인 자습서

내 숨을 혼란에 이어, 새로운 스칼라 2.8 컬렉션 라이브러리가 구축 된 방법을 설명하는 좋은 자원은 무엇인가. 나는 함께하는 방법을 다음과 맞춤에 대한 몇 가지 정보를 찾기 위해 관심 :

해결법

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

    1.아마 당신의 첫 번째 참조해야 마틴 오더 스키에 의해 2.8 수집 워크를 통해이있다. 그것은 자신의 컬렉션을 설계하고자하는 사람들에게 특히 관심이 될 것 건축 노트로도 보충하고있다.

    아마 당신의 첫 번째 참조해야 마틴 오더 스키에 의해 2.8 수집 워크를 통해이있다. 그것은 자신의 컬렉션을 설계하고자하는 사람들에게 특히 관심이 될 것 건축 노트로도 보충하고있다.

    그러한 일이 존재하기 전에이 답변의 나머지 방법을 작성했다 (사실, 2.8.0 이전 자체가 릴리스되었습니다).

    당신은 스칼라 SID # 3으로 그것에 대해 논문을 찾을 수 있습니다. 그 지역의 다른 논문뿐만 아니라 스칼라 2.7과 2.8의 차이에 관심이있는 사람들에게 흥미 있어야한다.

    나는 선택적으로, 논문에서 인용하고, 일부 광산의 생각을 보완하는 것이다. 이 decodified.com 티아에 의해 생성 된 일부 이미지는, 또한, 원래 SVG 파일은 여기에서 찾을 수 있습니다.

    변경 가능한 컬렉션을 하나, 불변의 컬렉션에 대한 다른 하나는 컬렉션에 대한 가정을하지 않는 한 : 컬렉션에 대한 특성의 세 계층이 실제로있다.

    스칼라 2.9에 도입 된 병렬 직렬 및 아마 병렬 컬렉션, 구별도 있습니다. 나는 다음 섹션에서 그들에 대해 이야기 할 것입니다. 이 절에서 설명 된 계층은 비평 모음 독점적 말한다.

    다음 이미지 쇼 스칼라 2.8에 도입 된 비 특정 계층 :

    표시된 모든 요소가 특징이다. 다른 두 개의 계층으로 래퍼 클래스에 암시 적 변환을 통해 해당 계층에 속하는 것으로 볼 수있는 특성을 직접 상속 클래스뿐만 아니라 클래스도있다. 이 그래프에 대한 전설은 그 후 발견 될 수있다.

    불변의 계층 구조 그래프 :

    변경 가능한 계층 구조 그래프 :

    전설:

    여기에 수집 계층의 축약 된 ASCII 묘사는 이미지를 볼 수없는 사람들을 위해입니다.

                        Traversable
                             |
                             |
                          Iterable
                             |
          +------------------+--------------------+
         Map                Set                  Seq
          |                  |                    |
          |             +----+----+         +-----+------+
        Sorted Map  SortedSet   BitSet   Buffer Vector LinearSeq
    

    스칼라 2.9 병렬 컬렉션을 소개 할 때, 설계 목표 중 하나는 가능한 한 원활한로 사용을 만드는 것이 었습니다. 간단히 말해서, 하나는 병렬 하나가 아닌 병렬 (직렬) 수집을 교체하고 즉시 혜택을 얻을 수 있습니다.

    그때까지 모든 컬렉션 시리얼 있었다 때문에,이를 이용하여 많은 알고리즘을 가정하고 시리얼 하였다는 사실에 의존. 가정 사항과 방법에 공급 병렬 컬렉션은 실패합니다. 따라서, 모든 계층은 이전 섹션 위임 직렬 처리 기술.

    두 개의 새로운 계층 구조는 병렬 컬렉션을 지원하기 위해 만들어졌다.

    병렬 컬렉션 계층 구조 특성에 대해 동일한 이름을 가지고 있지만, 파가 앞에 : ParIterable, ParSeq, ParMap 및 ParSet. 병렬 액세스를 지원하는 모든 수집 ParIterable 강한 특성을 지원할 수 있기 때문에, 더 ParTraversable 없다는 것을 유의해야한다. 그것은 더 전문 특성 중 일부는 하나의 직렬 계층에 존재하지 않습니다. 이 모든 계층 구조는 디렉토리 scala.collection.parallel 아래에 있습니다.

    병렬 컬렉션을 구현하는 클래스는 모두 가변 및 불변 병렬 콜렉션 ParHashMap 및 ParHashSet와 다를 플러스 ParRange 및 ParVector는 immutable.ParSeq 및 ParArray 구현 mutable.ParSeq 구현.

    GenTraversable, GenIterable, GenSeq, GenMap 및 발전기 : 또 다른 계층도하지만 접두사 세대와, 그 거울을 직렬 및 병렬 컬렉션의 특성을 존재한다. 이러한 특성은 병렬 및 직렬 컬렉션을 모두 부모입니다. 서열 복용 방법 병렬 컬렉션을 수신 할 수 있지만 GenSeq 복용 방법은 직렬 및 병렬 컬렉션 모두 작동하도록 기대되는이 방법.

    이러한 계층 구조화 된 방법을 감안할 때, 스칼라 2.8 용으로 작성된 코드는 스칼라 2.9과 완벽하게 호환, 그리고 일련의 행동을 요구했다. 다시 쓰는없이, 병렬 컬렉션을 이용할 수는 없지만, 필요한 변화는 매우 작다.

    상관 컬렉션 그것에있어서 파를 호출하여 병행으로 전환시킬 수있다. 마찬가지로, 임의의 컬렉션 그것에있어서의 서열을 호출하여 하나 직렬로 변환 할 수있다.

    컬렉션을 이미 요청 종류 (병렬 또는 직렬)의 있었다면, 변환이 발생하지 않습니다. 경우 직렬 컬렉션 병렬 수집 또는 대등 한 통화 서열 그러나, 요구 된 특성을 가진 새로운 컬렉션이 생성된다.

    컬렉션의 요소에서 만든 서열을 반환 toSeq로, 평행하지 않은 모음으로 컬렉션을 전환하지 혼동 서열을 마십시오. 병렬 컬렉션 toSeq를 호출하면 ParSeq 아닌 시리얼 모음을 반환합니다.

    많은 구현하는 클래스와 subtraits이 있지만, 더 방법이나보다 구체적인 보장을 제공하지만,이를 구현할 수있는 클래스의 수를 감소 각각의 계층 구조에서 몇 가지 기본적인 특성이있다.

    다음 하위 절에서 나는 주요 특성에 대한 간략한 설명과 그들 뒤에 아이디어를 줄 것이다.

    이 특성은 특성에 이동,하지만 당신은 한 번만 사용할 수있는 제한과 아래에 설명 거의 같다. 즉하는 TraversableOnce에서 호출있는 방법은 사용할 수 없게 될 수도 있습니다.

    동일한 방법은 컬렉션 및 반복자간에 공유 할 수 있도록 이러한 제한은 가능하게한다. 이 TraversableOnce을 받아 다시 작성하는 경우에 반복자 고유의 방법을 사용하여 반복자와 작동하지만 실제로 어떤 전혀 수집, 플러스 반복자와 함께 작업 할 수있는 방법에 대한 것을 가능하게한다.

    TraversableOnce이 컬렉션과 반복자를 통합 때문에, 어떤에만 컬렉션에 관심 스스로를 이전 그래프에 표시되지 않습니다.

    컬렉션 계층 구조의 맨 위에 특성에 이동합니다. 의 유일한 추상적 인 작업이다

    def foreach[U](f: Elem => U)
    

    동작은 컬렉션의 모든 요소를 ​​통과하고, 각각에 소정의 동작 F에 적용하는 것을 의미 요소. 응용 프로그램은 그 부작용 수행됩니다; 실제로 F의 어떤 함수 결과에 의해 폐기 각각.

    Traversible 객체는 유한 또는 무한 될 수 있습니다. 무한 통과 가능한 오브젝트의 예는 스트림 자연수의 Stream.from (0). 메소드 hasDefiniteSize 콜렉션 가능성이 있는지 여부를 나타내는 무한. hasDefiniteSize가 true를 돌려주는 경우, 컬렉션은 확실히 유한하다. false를 반환하는 경우, 이 무한 또는 유한 될 수 있도록 수집은 완전히 아직 정교하지되지 않았습니다.

    이 클래스는 효율적으로 foreach는 측면 (이상 40 중)에서 구현 될 수있는 방법을 정의합니다.

    이 특성은 추상적 인 방법 반복자를 선언합니다 반환 반복자 그 수익률의 모든 컬렉션의 요소 하나 하나. 의 Iterable의 foreach는 반복자 방법의 관점에서 구현된다. 의 Iterable의 서브 클래스는 종종 효율을위한 직접 구현 foreach는 우선합니다.

    클래스의 Iterable 또한 반복자가 사용할 수있는 경우에만 효율적으로 구현 될 수에 이동에 약간 덜 자주 사용 방법을 추가합니다. 그들은 다음과 같이 요약 할 수 있습니다.

    xs.iterator          An iterator that yields every element in xs, in the same order as foreach traverses elements.
    xs takeRight n       A collection consisting of the last n elements of xs (or, some arbitrary n elements, if no order is defined).
    xs dropRight n       The rest of the collection except xs takeRight n.
    xs sameElements ys   A test whether xs and ys contain the same elements in the same order
    

    서열, 설정 및지도 :의 Iterable 후에 상속 세 가지 기본 특성이 온다. 세 명 모두가이 방법을 적용하고 세 가지가 PartialFunction의 특성을 구현하지만, 적용의 의미는 각각의 경우에 다릅니다.

    I 서열, 설정의 의미를 신뢰하고지도 직관적이다. 그 후, 클래스는 성능에 관해서 특히 보장을 제공하는 특정 구현에 휴식 및 방법은 그것의 결과로 사용할 수 있습니다. 또한 가능 등 LinearSeq, IndexedSeq 및 SortedSet의 등의 추가 개선, 몇 가지 특징이 있습니다.

    아래 목록이 향상 될 수 있습니다. 제안에 코멘트를 남겨 나는 그것을 고칠 수 있습니다.

    이것은 최대 코드 재사용을 달성하기 위해 이루어졌다. 특정 구조를 가진 클래스에 대한 구체적인 일반적인 구현 (A에 이동,지도 등)이 같이 클래스에서 이루어집니다. 클래스는 다음 optmized 수있는 선택 메소드를 오버라이드 (override), 일반 소비를위한 것.

    즉, 클래스에 대한 빌더,지도와 같은 방법으로 사용할 수있는 방법으로 그 클래스의 인스턴스를 생성하는 방법을 알고있는 객체는 동반자 객체의 메소드에 의해 생성된다. 따라서, X 형의 객체를 구축하기 위해, 나는 불행하게도 X의 동반자 개체에서이 빌더를 얻을 필요가,이 때문에 그 객체 X.에 클래스 X에서 얻을, 스칼라, 방법이 없습니다 클래스 X.의 컴패니언 객체를 반환 X 컴패니언의 각 인스턴스에 정의 된 방법에있어서,

    정상 프로그램과 같은 방법에 대한 몇 가지 사용이있을 수 있지만, 목표 컬렉션 라이브러리에서 코드 재사용을 가능하게한다.

    당신은 그것에 대해 신경 안된다. 그들은 정확하게 그래서 당신이 그것을 작동하는 방법을 알아낼 필요가 없다는 것을 암시한다.

    이 implicits 부모 클래스를 정의 할 수있는 컬렉션의 방법을 사용하지만 여전히 동일한 유형의 컬렉션을 반환하기 위해 존재한다. 예를 들어,지도 방법은 TraversableLike에 정의되어 있지만이 목록에 사용되는 경우는 목록 등을 얻을 수 있습니다.

  2. from https://stackoverflow.com/questions/1722137/scala-2-8-collections-design-tutorial by cc-by-sa and MIT license