2023. 11. 5. 23:48ㆍjava
위의 그림은 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 |