기본 콘텐츠로 건너뛰기

2018의 게시물 표시

Stream java8

List, Map, Set, Array 들과는 달리 내부적인 저장소가 없다.  주로 사용하는 Collections 들은 내부적으로 저장소가 있다. 심지어 String마저도 내부적으로는 char[] 를 가지고 있다. 대부분의 자료구조들이 자체적으로 값을 가지고 있는것에 반해 Stream은 저장소를 별도로 가지고 있지 않다. List < String > l = new ArrayList ( Arrays . asList ( "one" , "two" ) ) ; Stream < String > sl = l . stream ( ) ; l . add ( "three" ) ; String s = sl . collect ( joining ( " " ) ) ; System . out . println ( s ) ; 위코드의 출력값은 “one two three” 이다. 계속 참조하고 있다라고 이해하는게 차라리 받아들이기 쉬울 것 같다. pipeline Stream에서 호출하는 함수들은 대부분 pipeline 인터페이스에 정의되어있다. 파이프라인에서 사용되는 함수들은 크게 2가지다. 중개함수, 종료함수 - 중개함수 : filter(), map(), sorted() .. - 종료함수 : sum(), max() .. 중개함수는 Stream을 구성하는 엘리먼트들이 서로 연관성이 있느냐에 따라 stateless, stateful로 나뉜다. - stateless : filter(), map()... - stateful : sorted().. 이렇게 나누는 또 다른 이유는 Stream을 병렬로 실행했을때 안정성을 확보할 수 있느냐 없느냐의 차이일 수도 있다. 종료함수들은 내부적으로 reduce()를 호출하는데, reduce()함수 호출시 Stream이 재사용할 수 없도록 St

BaseStream

Stream 인터페이스는 BaseStream을 상속받는다. Stream을 보기전에 미리 BaseStream을 볼 필요가 있다.  public interface Stream < T > extends BaseStream < T , Stream < T >> { . . . BaseStream은 AutoCloseable인터페이스를 상속받고 다음과 같은 몇가지의 함수들을 가지고 있다. public interface BaseStream < T , S extends BaseStream < T , S >> extends AutoCloseable { Iterator < T > iterator ( ) ; spliterator < T > spliterator ( ) ; boolean isParallel ( ) ; S sequential ( ) ; S parallel ( ) ; S unordered ( ) ; S onClose ( Runnable closeHandler ) ; @Override void close ( ) ; } 자바8 이후에서 인터페이스는 함수를 선언으로만 끝내지 않고 정의까지 포함한다. 그 대표적인 예가 람다식을 사용하는 @FunctionalInterface(  https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html ) 이다. 하지만 BaseStream은 선언부만 정의되어있다. 즉 상속받는곳에서 입맛에 맛게 오버라이드 하여 사용하고 있다. /** * Returns an iterator for the elements of this stream. * * <p>This is a <a href="package-summary.html#StreamOps"&