2016-09-11 3 views
0

오늘 저는 Java 8에서 Streams에 대해 알고 있습니다. 난 콜렉션이 데이터 구조가 현재 보유-마다 그 전에 컬렉션의 요소를 계산하는 모든 값을 유지하는 메모리 데이터 구조이며, 이러한 개념Java 8에서 Streams와 Collections의 차이점은 무엇입니까

읽어 때 혼란있어 컬렉션에 추가되었습니다. 반대로, 스트림은 요구에 따라 요소가 계산되는 개념적으로 고정 된 데이터 구조입니다.

나는 이해할 수 없다. 컬렉션은 컬렉션에 추가되기 전에 계산 된 값만 보유 할 수 있습니까? 또한 고정 된 데이터 구조와 스트림을 비교하면 무엇을 의미합니까?

누군가이 설명을 할 수 있습니까?

+1

당신이 무엇을 요구하고 있는지 분명하지 않습니다. '추가되기 전에 계산 된'에 대해 당신이 이해하지 못하는 것은 무엇입니까? 또는 '개념적으로 고정 된 자료 구조'?또한 귀하의 질문에 따라이 용어의 의미에 대해 물어 보시는 지, 또는 제목에 따라 colelctions와 스트림 사이의 차이에 대해 묻는 것은 더 명확하지 않습니다. – EJP

답변

14

당신은 인용의 소스를 제공, 그래서 내가 당신에게 javadoc을 인용하지 않았다

스트림은 컬렉션에서 다른 여러 가지 방법으로 :

  • 없음 저장합니다. 스트림은 요소를 저장하는 데이터 구조가 아닙니다. 대신 데이터 구조, 배열, 생성기 함수 또는 I/O 채널과 같은 소스에서 계산 작업 파이프 라인을 통해 요소를 전달합니다.
  • 기능상의 변경. 스트림에 대한 연산은 결과를 생성하지만 소스를 수정하지는 않습니다. 예를 들어 컬렉션에서 얻은 Stream을 필터링하면 소스 컬렉션에서 요소를 제거하지 않고 필터링 된 요소가없는 새 Stream가 생성됩니다.
  • 게으름 추구. 필터링, 매핑 또는 중복 제거와 같은 많은 스트림 작업을 지연 구현할 수 있으므로 최적화 기회가 노출됩니다. 예를 들어, "세 개의 연속 모음을 가진 첫 번째 String을 찾으십시오"는 모든 입력 문자열을 조사 할 필요는 없습니다. 스트림 동작은 중간 (Stream- 생성) 작업과 터미널 (값 또는 부작용 생성) 작업으로 구분됩니다. 중간 작업은 항상 게으르다.
  • 아마도 제한이 없습니다. 컬렉션에는 유한 크기가 있지만 스트림에는 필요하지 않습니다. limit(n) 또는 findFirst()과 같은 단락 동작은 무한 스트림에 대한 계산이 유한 한 시간 내에 완료되도록합니다.
  • 소모품. 스트림의 요소는 스트림의 수명 동안 한 번만 방문됩니다. Iterator처럼 소스의 동일한 요소를 다시 방문하려면 새 스트림을 생성해야합니다. 이에

Collection 객체 (요소)의 용기이다. 개체가 이전에 컬렉션에 추가되지 않은 경우 컬렉션에서 개체를 가져올 (검색 할) 수 없습니다.

+0

'이전에 컬렉션에 개체를 추가하지 않았다면 컬렉션에서 개체를 가져올 수 없습니다. '이것은 사실이 아니며 그러한 계약이 없습니다. 컬렉션은 비어 있지 않은 삶을 시작할 수 있습니다. 당신이 그것을 요구할 때만 (예를 들어, Hibernate의 게으른 콜렉션들) 요소를 실현할 수있다. 반복자가 무한대의 요소를 반환 할 수 있기 때문에 유한 크기조차도 의심스러운 속성입니다. –

+1

@MarkoTopolnik'Iterator'는'Collection'이 아니므로 두 가지를 혼동하지 마십시오. 컬렉션에는'size()'가 있습니다. --- 나는 그 시간에 그것들을 추가하는 것과 동일하게 구성하는 동안 요소 목록을주는 것을 고려한다. 요소는 컬렉션의 구성원이되기 전에 존재합니다. ---하지만 당신이 옳다면, 실제 저장소를 백업하지 않고'Collection' 인터페이스를 구현하는 것이 가능합니다. Hibernate가 그 예입니다. 하지만 거기에서도 기술적으로 실제 저장소 (데이터베이스)에서로드가 지연됩니다. 요소는 이미 존재합니다. – Andreas

+0

Collection의 계약은 iterator를 요구하므로 혼란스럽지 않습니다. 콜렉션은'size()'를 가지고 있는데, 나는 그것이 "의심 스럽다"라고 말한 것이다 --- 예를 들어,'Map'도 크기를 가지고있다. 그러나'HashMap'에 2^31 개 이상의 원소를 가질 수있다. "실제로 존재하는"요소의 특성은 철학적입니다. 또한, 예를 들어, 주사위를 던짐으로써 실현시에 계산 될 수도있다. –

관련 문제