stream 문법

2023. 11. 5. 23:48java

출처 : http://tcpschool.com/java/java_stream_creation

 

 

위의 그림은 stream을 관통하는 그림이라고 생각한다.

 

정의하는 방법

ArrayList<Integer> list = new ArrayList<Integer>();
Stream<Integer> stream = list.stream();

String[] arr = new String[]{"1", "2", "3", "4"};
Stream<String> stream1 = Arrays.stream(arr);

 

이외에도 여러 방법이 있지만 대표적인 방법은 위의 2가지이다.

여기서 알아야할건 Stream<T> 와 Arrays.stream은 아예 다르다는 것이다.

 

Arrays.stream의 기능을 확인하기 위해서 아래의 추상 클래스를 확인해야한다.

abstract class ReferencePipeline<P_IN, P_OUT>
        extends AbstractPipeline<P_IN, P_OUT, Stream<P_OUT>>
        implements Stream<P_OUT>  

 

또 Stream<T>의 기능을 확인하기 위해서 아래의 인터페이스를 확인해야한다.

public interface Stream<T> extends BaseStream<T, Stream<T>> 

 

 

주요 메소드

 

필터링 : filter(), distinct()

변환 : map() , flatMap()

제한 : limit(), skip()

정렬 : sorted

 

일반적인 흐름

public interface Stream<T> extends BaseStream<T, Stream<T>> {

    Stream<T> filter(Predicate<? super T> predicate);
    <R> Stream<R> map(Function<? super T, ? extends R> mapper);
    <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
    Stream<T> sorted();
    Stream<T> sorted(Comparator<? super T> comparator);
    Stream<T> limit(long maxSize);
    void forEach(Consumer<? super T> action);
    <A> A[] toArray(IntFunction<A[]> generator);
    
    ....
}

 

인터페이스를 살펴보면 주석을 제외하고 위와같은 형태임을 할 수 있다.

 

fillter 같은 경우 매개변수로 Predicate 인터페이스를 따르는 람다식이 매개변수로 온다.

(Predicate 인터페이스는 T, 혹은 T보다 상위클래스의 제네릭 타입으로 정의된다.)

반환형으로 람다식의 연산을 수행하고 True인 stream<T>를 return한다.

 

map 같은 경우 매개변수로 Function 인터페이스를 따르는 람다식이 매개변수로 온다. 

(T, 혹은 T보다 상위클래스, R 혹은 R보다 하위 클래스의 제네릭 타입으로 정의된다.)

반환형으로 람다식의 연산을 수행하고 변환된 R로 구성된 stream<R>를 return한다.

 

forEach같은 경우 매개변수로 Consumer 인터페이스를 따르는 람다식이 매개변수로 온다.

반환형은 없고 람다식에 선언된 메소드들을 수행한다.

 

'java' 카테고리의 다른 글

디자인 패턴(생성 패턴)  (0) 2023.11.07
객체 지향 5원칙 SOLID  (0) 2023.11.07
함수형 프로그래밍 , 람다식  (0) 2023.11.05
자바 Arrays.asList  (0) 2023.11.05
자바 String Literal, String Object? immutable?  (0) 2023.11.05