24장 the scala collections api - codeport/scala GitHub Wiki
- 스칼라 2.8의 새로운 컬렉션 프레임웍크
- 사용하기 쉽다.
- 간단하다
- 안전하다.
- 빠르다
- 유니버셜하다: 컬렉션들은 같은 오퍼레이션을 제공한다.
24.1 Mutable and immutable collections
스칼라의 컬랙션은 크게 mutable 컬렉션과 immutable 컬랙션을 나뉜다.
24.2 Collections consistency
- Traversable
- Iterable
- Seq
- IndexedSeq
- Vector
- ResizableArray
- GenericArray
- LinearSeq
- MutableList
- List
- Stream
- Buffer
- ListBuffer
- ArrayBuffer
- IndexedSeq
- Set
- SortedSet
- TreeSet
- HashSet (mutable)
- LinkedHashSet
- HashSet (immutable)
- BitSet
- EmptySet, Set1, Set2, Set3, Set4
- SortedSet
- Map
- SortedMap
- TreeMap
- HashMap (mutable)
- LinkedHashMap (mutable)
- HashMap (immutable)
- EmptyMap, Map1, Map2, Map3, Map4
- SortedMap
- Seq
- Iterable
24.3 Trait Traversable
-
Traversable트레이트는 컬렉션계층의 최상위에 있다. -
Traversable트레이트는foreach대한 추상 오퍼레이션 가지고 있다.def foreach[U](f: Elem => U) -
Traversable트레이트는 여러가지 메서드를 가지고 있다.- 추가:
++- 두 traversable을 합치거나 이터페이터의 모든 엘리먼트를 추가한다 - Map:
map,flatMap, `collect- 컬렉션 엘리먼트에 함수를 적용한 새로운 컬랙션을 만든다 - 변환:
toIndexedSeq,toIterable,toStream,toArray,toList,toSeq,toSet,toMap-Traversable컬렉션을 지정한 컬렉션으로 변환한다. - 복사:
copyToBuffer,copyToArray - 크기:
isEmpty,nonEmpty,size,hasDefiniteSize - 엘리먼트 획득:
head,last,haedOption,lastOption,find` - 하위컬렉션 획득:
takeWhile,tail,init,slice,take,drop,filter,dropWhile,filterNot,withFilter - 세분화:
splitAt,span,partition,groupBy - 엘리먼트 테스트:
exists,forall,count - 폴드:
foldLeft,foldRight,/:,:\,reduceLeft,reduceRight - 구체적인 폴드:
sum,product,min,max - 문자열:
mkString,addString,stringPrefix` - 뷰:
view메서드의 두 가지 오버로드, view는 lazy 평가하는 컬렉션
- 추가:
24.4 Trait Iterable
-
Iterable트레이트에 정의된 모든 메서드는 추상메서드iterator에 대한 것이다. -
Traversable트레이트의foreach메서드는Iterable의iterator로 구현되었다. -
grouped:val vs = List(1, 2, 3, 4, 5) val git = xs grouped 3 git.next() // List(1,2,3) git.next() // List(4,5) -
sliding:val vs = List(1,2,3,4,5) val sit = xs sliding 3 sit.next() //List(1,2,3) sit.next() //List(2,3,4) -
왜
Traversable와Iterable이 둘다 있는가?- 때로는
Traversable가iterator구현보다foreach구현을 제공하기가 더 쉽고 효율적이다.
- 때로는
24.5 The sequence traits Seq, IndexedSeq, and LinearSeq
- 인덱싱과 길이:
apply,isDefinedAt,length,indices,lengthCompare - 인덱스 검색:
indexOf,lastIndexOf,indexOfSlice,lastIndexOfSlice,indexWhere,lastIndexWhere,segmentLength,prefixLength - 추가:
+:,:+,padTo - 갱신:
updated,patch - 정렬:
sorted, sortWith,sortBy` - 반전:
reverse,reverseIterator,reverseMap - 비교:
startsWith,endsWith,contains,corresponds,containsSlice - 멀티셋:
intersect,diff,union,distinct - buffers는 mutable sequences의 하위카테고리이다. buffers는 존재하는 엘리먼트의 갱신과 엘리턴트 추가/삭제 를 재원한다.
ListBuffer과ArrayBuffer가 있다.
24.6 Sets
- Set은 중복요소가 없는 Iterables이다.
- 테스트:
contains,apply, subsetOf` - 추가:
+,++ - 제거:
-,-- - Set :
intersect,union,diff,&,|,&~ SortedSet어떤 순서로 엘리먼트를 추가하던지 정렬된 순서로 탐색한다.- Bit set
24.7 Maps
- Map은 키, 밸류 쌍으로 이루어진 Iterables이다.
- 검색:
apply,get,getOrElse,contains,isDefinedAt - 추가/갱신:
+,++,updated - 삭제:
-,-- - 하위컬렉션 생성자:
keys,keySet,keysIterator,valuesIterator,values` - 변환:
filterKeys,mapValues getOrElseUpdate는 캐시처럼 동작하는 맵에 접근하는데 유용하다.
24.8 Synchronized sets and maps
- 쓰레드세이프한 맵이 필요하면
SynchronizedMap트래이트를 맵에 믹스인할 수 있다. - 존재 하지 않는 키를 조회하면
NoSuchElementException이 발생한다.default메서드를 오버라이드하면 존재하지 않는 키를 조회할 때의 동작을 바꿀 수 있다.
24.9 Concrete immutable collection classes
Lists는 유한한 immutable 시퀀스다. 첫 요소와 나머리 리스트에 대한 상수시간 접근을 제공하고 cons로 리스트앞에 엘리먼트를 상수타임으로 추가할 수 있다.Streams는 리스트와 비슷하지만 lazy하게 계산한다. 리스트의::와 비슷하게 스트림에서는#::를 사용할 수 있다.- 리스트는 head를 처리할 때 아주 효율적이지만 다른 부분에는 시간이 많이 걸린다.
Vectors는 2.8에서 추가된 컬렉션으로 어떤 요소에도 효율적인 접근을 제공한다. Vectos는 immutable이다. - LIFO 시퀀스가 필요하면
Stack를 사용해라. - FIFO에는
Queue를 사용해라 Range는 동일한 간격으로 떨어진 integer의 정렬된 시퀀스이다.- Hash tries는 immutalbe set과 map을 효율적으로 구현하는 표준적인 방법이다.
- Red-black tree는 하나는 "Red"로 표시되고 다른 것들은 "black"로 표시되는 balanced binary tree의 형식이다.
- immutable bit set은 큰 수의 비트를 작은 정수로 나타낸 컬렉션이다.
- list map은 키/밸류 쌍의 링크드 리스트로 된 맵이다.
24.10 Concrete mutable collection classes
- array buffer는 array과 size를 가지고 있다. 대부분의 동작은 array의 속도와 같다.
- List buffer는 내부적으로 배열대신 링크드리스트를 사용한다는 점을 제외하면 array buffer와 같다.
- String builder는 문자열을 만드는데 유용하다.
- linkedlist는 다음 포인터로 연결되 노드로 이루어진 시퀀스이다. 대부분의 언어에서 비어있는 링크드리스트는 null이지만 Scala에서는 시퀀스 오퍼레이션을 사용하기 위해 null이 아니다.
DoubleLinkedList는 next외에 이전 노드를 가르키는 prev라는 필드가 있다는 점을 제외하면 linked list와 비슷하다MutableList는 리스트의 terminal empty node를 참조하는 포인터를 가진 링크드 리스트로 이루어져있따Queue의 mutable 버전이다. immutable과 비슷하지만enqueue대신+=,++=를 사용한다- Array sequence는 내부에
Array[AnyRef]로 요소를 저장한 고정된 사이즈의 시퀀스다 - mutable버전의
Stack ArrayStack는 필요한 만큰 사이즈를 조정하는 mutable stack의 대체 구현체이다.- hash table은 배열에 요소를 저장하고 각 요소의 저장 위치는 hash code로 결정한다. 이터레이션은 특정순서로 일어난다는 보장이 없다.
- weak hash map은 해시맵의 특수한 종류로 키를 참조하는 것이 더이상 없으면 map에서 삭제된다.
- concurrent map은 여러 쓰레드에서 동시에 접근할 수 있다.
- mutable bit set은 immutable버전과 같지만 수정할 수 있다.
24.11 Arrays
-
스칼라의 배열은 Java의 배열과 1대1 대응된다.
-
스칼라 배열을 자바보다 더 많은 것을 제공한다.
- 제너릭을 지원한다.
- 스칼리 시퀀스화 호환성이 있다.
- 시퀀스의 모든 오퍼레이선을 지원한다.
-
자바 배열의 타입컨버전에서
ArrayOps가WrappedArray컨버전보다 우선순위가 높다. -
제너릭 지원에서 type erase로 인한 오류를 막기 위해서
scala.reflect.ClassManifest타임의 class manifest를 줄 수 있다.def deenElems[T](xs: Vector[T](implicit m: ClassManifest[T]): Array[T] = ... -
context bound를 사용해서 더 간단히 쓸 수 있다.
def evenElems[T: ClassManifest](xs: Vector[T]): Array[T] = ...
24.12 Strings
- 스트링도 모든 시퀀스 오퍼레이션을 지원한다.
24.13 Performance characteristics
- 각 컬렉션은 다른 성능 특징이 있다.
24.14 Equality
- 다른 카테고리의 컬렉션은 항상 다르다.
- 같은 카테로리의 컬렉션은 같은 요소가 있으면 같다.
24.15 Views
map,filter,++는 transformers라고 부른다.- 트랜스포머는 strict와 non-strict(lazy)로 구현된다.
- strict 트랜스포머 생성자는 모든 요소의 새로운 컬렉셩을 생성한다.
- non-strict 트랜스포머틑 결과 컬렉션의 프록시만 생성하고 요청될때 요소를 생성한다.
- view는 기반 클래스의 모든 트랜스포머를 lazy하게 구현한 특수한 종류의 컬렉션이다.
xs.view는xs와 같은 컬렉션이지만 lazy하게 트랜스포머를 lazy하게 구현한다. 다시 strict한 컬렉션을 얻으려면force메서드를 사용한다.
24.16 Iterators
- iterator는 컬렉션이 아니라 컬렉션의 요소에 접근하는 방법이다.
- 두가지 기본동작
next와hasNext가 있다. BufferedIterator은head메서드를 제공하는Iteraotr의 하위트레이트이다.- 모든 이터레이터에서
buffered메서드로 buffered iterator로 변환할 수 있다.
24.17 Creating collections from scratch
- 모든 컬렉션은 컬렉션 이름뒤에 괄호안에 요소를 넣어서 생성할 수 있다.
24.18 Conversions between Java and Scala collections
JavaConversions객체로 주요 컬렉션을 implicit conversion을 지원한다.
24.19 Migrating from Scala 2.7
- scalac에
-deprecation,-Xmigration플래그를 주면 마이그레이션 경고를 볼 수 잇따.