Scala에서 Seq와 List의 차이점


299

많은 예제에서 때때로 Seq가 사용되는 반면 다른 시간은 목록입니다 ...

이전의 스칼라 유형과 Java에서 오는 목록 이외의 차이점이 있습니까?

답변:


408

Java 용어로 Scala Seq는 Java List이고 Scala List는 Java LinkedList입니다.

참고 SeqA는 trait자바의 동일합니다, interface하지만 동등한와 수비수 방법을 떠오르는. Scala ListNiland 로 확장되는 추상 클래스로 ::,의 구체적인 구현입니다 List.

따라서 Java List가 인 interface경우 Scala List는 구현입니다.

그 외에도 Scala List는 불변이며 이는 사실이 아닙니다 LinkedList. 실제로, Java는 변경 불가능한 콜렉션과 동등하지 않습니다 (읽기 전용 항목은 새 오브젝트를 변경할 수 없음을 보장하지만 여전히 기존 오브젝트를 변경하여 "읽기 전용"오브젝트를 변경할 수 있음).

스칼라 List는 컴파일러와 라이브러리에 의해 고도로 최적화되었으며 함수형 프로그래밍의 기본 데이터 유형입니다. 그러나 한계가 있으며 병렬 프로그래밍에는 적합하지 않습니다. 요즘 Vector은보다 나은 선택 List이지만 습관은 깨지기 어렵습니다.

Seq시퀀스에 대한 좋은 일반화이므로 인터페이스에 프로그래밍하는 경우이를 사용해야합니다. 실제로는 세 가지가 있습니다. collection.Seq, collection.mutable.Seqcollection.immutable.Seq은 범위로 가져온 "기본"인 후자입니다.

이이기도 GenSeq하고 ParSeq. 후자는 가능한 경우 병렬로 실행되는 반면, 전자는 코드의 병렬화가 중요하지 않은 경우에 적합한 일반화 Seq및의 부모 ParSeq입니다. 둘 다 비교적 새로 도입되었으므로 사람들은 아직 많이 사용하지 않습니다.


3
RE "자바는 불변의 컬렉션에는 해당이 없습니다" 하지만, String수집되지는 자바 프로그래머들에게 친숙한 불변 클래스의 예입니다.
huynhjl

15
@huynhjl 요점 옆에 있습니다. Java에 존재하는 것과 Scala에 존재하는 것 사이에 유사점을 두었습니다 .Java에는 변경 가능 / 변경 불가능한 콜렉션 개념이 없습니다.
Daniel C. Sobral

2
Java에는 실제로 변경 불가능한 콜렉션이 있습니다. 그것은 '잘 알려진'것이 아니라 거기에 있으며 제네릭을 많이 사용할 때 UnsupportedOperationException이것 때문에 일부를 칠 가능성 이 있습니다. Java에서 변경 불가능한 목록을 작성하려면 Collections.unmodifiableList ()를 사용하고 마찬가지로 Set, Maps 등의 다른 메소드도 있습니다. docs.oracle.com/javase/6/docs/api/java/util/…
jbx

27
@jbx 사실이 아닙니다. 이 메소드를 사용하면, 메소드를 수정하는 메소드에 대해 예외를 발생 시키지만 변경할 수없는 오브젝트를 얻을 수 있습니다. 수정 불가능한 오브젝트가 작성된 후 원래 오브젝트가 수정되면 수정 불가능한 오브젝트가이를 반영합니다. 따라서 수정 불가능합니다. 변경 불가능합니다.
Daniel C. Sobral

3
@jbx 수신 메소드는 수신 한 콜렉션에 대한 참조를 유지할 수 없으며 변경되지 않을 것이라고 가정하며 표준 Java 라이브러리에는 유형이 없으므로 불변성입니다. 예를 들어, 수신 방법이 스레드 안전을 보장 할 수 없습니다. 그리고 이것은 불변성으로 인한 지속적인 특성에도 영향을 미치지 않습니다. 이 모든 것이 없으면 "동등한"이라고 할 수 없습니다.
Daniel C. Sobral

81

서열은 요소의 정의 된 순서가 반복 가능하다. 시퀀스는 apply()0에서 시퀀스의 길이에 이르는 색인 방법 을 제공합니다 . Seq에는 Queue, Range, List, Stack 및 LinkedList를 포함한 많은 서브 클래스가 있습니다.

목록 불변의 연결리스트로 구현되는 서열이다. LIFO (last-in first-out) 액세스 패턴이있는 경우에 가장 적합합니다.

Scala FAQ 의 전체 컬렉션 클래스 계층 구조는 다음과 같습니다 .

여기에 이미지 설명을 입력하십시오


2
배열 (및 ArrayBuffer)은 어디에 있습니까? 그것은 반복적이지 않습니다
Peter Krauss

23

SeqList구현 하는 특성입니다 .

컨테이너를로 정의 Seq하면 Seq특성 을 구현하는 모든 컨테이너를 사용할 수 있습니다 .

scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int

scala> sumUp(List(1,2,3))
res41: Int = 6

scala> sumUp(Vector(1,2,3))
res42: Int = 6

scala> sumUp(Seq(1,2,3))
res44: Int = 6

참고

scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)

짧은 손입니다 :

scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)

컨테이너 유형이 지정되지 않은 경우 기본 데이터 구조의 기본값은 List입니다.


18

스칼라에서 List는 Seq에서 상속되지만 Product를 구현합니다 . 다음은 List 의 올바른 정의입니다 .

sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...

[참고 : 실제 정의는 . 조금 스칼라의 매우 강력한 컬렉션 프레임 워크의 사용과 및 메이크업에 맞추기 위해, 더 복잡한 비트입니다]


0

@ 다니엘-C-소브랄 말했듯이, 목록의 특성 서열를 확장하여 구현하는 추상 클래스이다 scala.collection.immutable.$colon$colon(또는 ::목록 및 seqs의 대부분은 우리의 형태로 초기화 사용하는 것이, 마음을 줄여서) 만 제외하고 교칙 Seq(1, 2, 3)이나 List(1, 2, 3)되는 모두 반환 scala.collection.immutable.$colon$colon따라서 다음과 같이 작성할 수 있습니다.

var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]

결과적으로 중요한 것은 노출하려는 메소드뿐입니다. 예를 들어 Seq에서 ::중복으로 발견되는 List에서 사용할 수 +:있으며 기본적으로 개인적으로 Seq를 고수합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.