Java 8 스트림을 사용한 정렬은 어떻게 작동합니까?


10

호출 할 때 Stream.sort(..)새로운 요소 배열이 생성되고 스트림이 새로 생성 된 정렬 된 배열을 반복합니까?

다시 말해, Java 8 Stream은 어떻게 작동 sort합니까?


왜이 질문에 대해 투표권을 얻습니까 ???
정보

2
귀하의 질문은 합리적이고 공감할 자격이 없습니다. 그러나 amon의 답변에 대한 여러분의 의견은 ... ugh : |
Andres F.

@AndresF. 그 투표는 내가 그 의견을 말하기 전에도 이루어졌다. 내가 화가 났던 이유 중 하나입니다.
InformedA

어쨌든 의견은 공감할 이유가 없습니다. 질문은 그 자체의 장점에 근거하며 내 의견으로는 유효합니다. 나는 그것을 upvoted.
Andres F.

답변:


10

grepcode.com 을 사용 하여 Java 표준 라이브러리 코드 (및 기타 라이브러리)를 검색 할 수 있습니다 . 불행히도 스트림 구현 코드는 다소 추상적입니다. 좋은 출발점은 스트림을 정렬 된 스트림으로 변환하는 내부 java.util.stream.SortedOps클래스 입니다.

현재 구현 (표준 라이브러리 용기의 스트림을 위해 사용)는 그 스트림이 이미 분류되어있는 경우 무 조작하게, 스트림의 크기는 (알려진 경우 배열을 사용 SizedRefSortingSink) 또는 크기 인 경우 ArrayList를 모든 요소를 축적 알 수 없음 ( RefSortingSink).

물론 이러한 구현 세부 사항은 릴리스에 따라 변경 될 수 있지만 기본 고려 사항은 보편적입니다. 스트림 정렬은 열망 / 차단 작업이며 무한 스트림 정렬은 의미가 없습니다. 즉, 스트림이 느릴 수 있으므로 스트림을 사용하는 경우 스트림 정렬이 유용하지 않지만 편리한 스트림 구문을 얻을 수 있습니다.

다른 스트림은 자체 구현을 제공해야 Stream.sorted()하며 이는 유사 할 수 있습니다.


1
나는 람다 또는 스트림이 "후드에서 헛소리"라고 제안하고 싶지 않습니다. 스트림에 대한 세부 사항이 다른 Java 개념과 비교하여 비정상적으로 복잡하더라도 둘 다 매우 편리합니다. 이러한 도구가 쓸모 없거나 해롭다는 선입견을 고수하고 싶다면 불필요하게 자신을 제한하는 것입니다.
amon

1
@amon-합의 된 플러스 스트림은 사실상 응용 프로그램을 변경하지 않고도 멀티 코어 병렬 구현을 롤링 할 수있는 가능성을 제공합니다. 그리고 스트림 구현의 복잡성은 정확히 그것에서 비롯됩니다. 그것은 단지 편의성 그 이상이며 올바른 추상화입니다. OP 에게-Lambda와 스트림이 왜 편리한 기능보다 훨씬 많은지 이해하려면 Mastering Lambdas ... 를 읽는 것이 좋습니다 .
Yuri Steinschreiber

3
@InformedA : 람다는 80 년 동안 존재 해 왔으며 현재의 모든 주류 프로그래밍 언어에 거의 존재합니다. 시냇물은 40 년 동안 존재 해 왔으며 거의 ​​모든 주류 컬렉션 프레임 워크에 존재합니다. 그것들은 다른 것들 (반복자, 게으른 목록, 열거 자, 열거 가능 항목)이라고 불릴 수도 있지만 거기에 있습니다. 람다 및 게으른 목록은 가장 오래되고 가장 안정적인 추상화 중 일부이며, 모든 새로운 유행, 과대 광고, 패러다임, 운동, 방법론, 기술, 언어, OS, 프레임 워크, 라이브러리에서 살아 남았습니다. 그것은 그들을 볼만한 가치가 있습니다.
Jörg W Mittag

2
@Informed 프로그래밍 언어 인 Java는 JVM에서 실행되는 바이트 코드의 헛된 추상화 일뿐입니다. JVM 자체는 C로 작성된 헛된 추상화입니다 (또는 C ++, 잊어 버렸습니다). C와 C ++는 어셈블리 언어에 대한 헛된 추상화입니다. 어셈블리 언어 자체조차도 마이크로 코드에 대한 헛소리 추상화입니다. 이는 회로에 대한 헛소리 추상화 이기도 합니다. 소프트웨어에 유용한 모든 것이 다른 것에 대한 "헛소리 추상화"라고 말할 수 있습니다.
Andres F.

3
@InformedA 솔직한 조언은 Java보다 기능 프로그래밍에 더 중점을 둔 언어를 배우는 것입니다. 일상적인 업무에 사용하지 않더라도 프로그래밍 언어와 Java에 도움이되는 디자인 선택에 대한 이해를 얻을 수 있습니다.
Andres F.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.