2016-12-27 1 views
10

사용 가능한 연산자는 +: 및입니다.스칼라 목록 - 콜론 대 더블 콜론 (+ : vs : :)

둘 다 같은 결과를 얻은 것처럼 보입니다. 두 방법 모두 내 초보자 눈 소스 코드에 대한

scala> List(1,2,3) 
res0: List[Int] = List(1, 2, 3) 

scala> 0 +: res0 
res1: List[Int] = List(0, 1, 2, 3) 

scala> 0 :: res0 
res2: List[Int] = List(0, 1, 2, 3) 

비슷한 (플러스 대장 방법은 빌더 공장의 사용과 제네릭에 대한 추가 조건을 가지고) 보인다.

이러한 방법 중 어느 것을 사용해야하며 언제 사용해야합니까?

+0

좋은 시작 장소 :'List' 대신에'Seq'와 똑같은 것을 시도해보십시오 ... –

답변

11

+:은 어떤 종류의 컬렉션에서도 작동하지만 ::List의 특정 구현입니다. +:에 대한 source을 자세히 보면 예상 반환 유형이 List 일 때 실질적으로 ::이 호출됩니다. 그 이유는 ::List 사례에 대해보다 효율적으로 구현 되었기 때문입니다. 즉, 새 머리글을 기존 목록에 연결하고 결과를 반환합니다. 즉, 일반 사례 인 +:의 전체 모음을 선형 복사하는 것과는 달리 상수 시간 연산입니다. . 당신이 공상을 할 수 있도록 반면에

+:

CanBuildFrom합니다 같은 것들 (이 경우 같은 좋게보고 있지,이기는하지만) : (그것은 당신,이 특정한 경우에 꽤 쓸모

val foo: Array[String] = List("foo").+:("bar")(breakOut) 

먼저 필요한 유형으로 시작할 수는 있지만 컬렉션에 요소를 추가하고 요소를 하나의 "go"로 변경하여 추가 복사본을 피할 수 있습니다.