728x90
반응형
SMALL
Stream 이란?
- Java8 부터 등장한 집합자료의 연산을 위해 사용 하는 객체
- 람다를 사용한다. https://jk25.tistory.com/196
- 본인은 InputStream, OutputStream 의 부모가 되는 객체로 예상 했었다.
- 아니었다. 확실히 아니다
- Collection, 배열 등의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있게 지원해준다.
- EX) for문이나 forEach 등의 반복문 혹은 iterator 를 통해 각각의 원소에 접근해서 가공하는 방법을 Stream 객체로 감싸게 되면서 필요한 형태로 가공하여 반환 할 수 지원하는 것이다.
- 일관성 있는 처리가 가능하다
- EX) 배열.length 와 Collections.size() 는 같은 연산을 하지만 자료 대상마다 부르는 함수가 다른 불편함을 극복 할 수 있다.
Stream 생성
What To Know
- Stream은 생성하면 Stream이 열리고 모든 연산을 행한 후에 결과를 받으면 닫히는 방식
- 한번 닫힌 Stream은 다시 사용 할 수 없다.
- stream(), of() 메소드를 사용해서 Collections, 배열 등 다양한 곳에서 생성이 가능
- stream() 은 Collections<> 인터페이스의 기본 메소드로 정의 되어있다.
- Stream.of() 를 통해 생성하는 것 또한 가능하다.
- Stream<T> 처럼 Generic을 사용하지만 기본 자료형에 한해서 Int, Double, Long 이 3개의 스트림이 존재 한다.
- IntStream
- DoubleStream
- LongStream
- 이를 Boxed Stream, Primitive Stream 으로 나뉘어 부른다.
int [] intArr = {5, 2, 1, 4, 3}; // 배열
double [] doubleArr = {0.1, 0.2, 0.3, 0.4};
List<String> stringList = List.of("first", "second", "thrid"); // List<String>
List<Integer> intList = List.of(1, 2, 3, 4, 5); // List<Integer>
Set<Integer> integerSet = Set.of(10, 20, 30); // Set<Integer>
Map<String, Integer> person = Map.of("zayson", 28, "chaeyoung", 26); //Map
// 기본 자료형 stream IntStream, DoubleStream
IntStream stream1 = Arrays.stream(intArr);
DoubleStream stream2 = Arrays.stream(doubleArr);
// 컬렉션 의 스트림 생성
Stream<String> stringStream = stringList.stream(); // Collection 의 Stream 생성
Stream<Integer> intStream = intList.stream();
// toString()을 지원하지는 않음
System.out.println(stream1); // java.util.stream.IntPipeline$Head@6d311334
System.out.println(stringStream); // java.util.stream.ReferencePipeline$Head@372f7a8d
// Map 의 Entry 들의 Stream
Stream<Map.Entry<String, Integer>> entryStream = person.entrySet().stream();
// Set 의 Stream
Stream<Integer> stream = integerSet.stream();
// Stream.of() 팩토리 메서드로 스트림 생성
Stream<Integer> integerStream = Stream.of(20, 30);
Stream<Customer> customerStream = Stream.of(
new Customer("Hey", 25),
new Customer("Hi", 24)
);
Stream 연산
What To Know
- Stream 연산은 기존 자료를 변경하지 않음
- EX) Stream으로 감싼 배열의 원본 배열을 Stream연산에서 건들이지 않음
- Stream 연산은 중간 연산과 최종 연산으로 구분 된다.
- 중간 연산
- 어떤 조건으로 자료를 filtering 하거나, 앞서 말하는 조건에 맞는 자료를 꺼내오는 등의 중간 연산은 체이닝이 된다.
// map(), filter(), sorted(), distinct(),limit(), skip()
// peek(), boxed(),mapToInt(), mapToDouble(), mapToLong()
- 최종 연산 (터미널 연산이라고도 함)
- 결과를 출력 해야 한다.
- EX) 합 또는 평균을 구하는 등의 연산
- 최종 연산의 경우 자료를 소모 하면서 연산을 수행한다.
- 따라서 맨 마지막에 등장 해야 하고, 최종 연산 후에는 Stream의 다른 연산은 적용 할 수 없다.
- 만약, 중간 연산이 있을 때, 중간 연산을 다 적용해야 하기때문에 지연 연산 이 발생
- 결과를 출력 해야 한다.
// forEach()
// min(), max(), count(), sum(), average()
// reduce(a, b)
// anyMatch(), allMatch(), noneMatch(),
// findFirst(), findAny(),
// collecting()
728x90
반응형
LIST
'프로그래밍 > 자바' 카테고리의 다른 글
[자바/기본] ArrayList 란? (0) | 2024.02.23 |
---|---|
[자바/기본] Stream 사용하는법 (Feat. Java) (1) | 2024.02.21 |
[자바/기본] Optional 이란? (0) | 2024.02.19 |
[자바/기본] 람다식 (Lambda) 란? (0) | 2024.02.16 |
[자바/기본] 내부 클래스(InnerClass) (0) | 2024.02.14 |