728x90
stream
1. 데이터의 저장소 x , 데이터들의 흐름
-쉽게 컨베이어 벨트를 생각하면 좋다!! map -> filter -> collection
2. Funtional in nature : 스트림이 처리한 데이터는 변하지 않는다.
// stream을 이용해도 원래 names의 값은 변하지 않는다.
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("son");
names.add("kane");
names.add("pogba");
names.add("mata");
Stream<String> name1 = names.stream().map(String::toUpperCase);
names.forEach(System.out::println);
}
/*
출력
son
kane
pogba
mata
*/
3. 스트림으로 처리하는 데이터는 오직 한번만 처리한다.
4. 데이터의 양이 무제한일 수도 있다. -> Short Circuit메소드를 사용해 제한한다.
5. 중개 오퍼레이션은 lazy하다
- 종료 오퍼레이션이 없다면 중개 오퍼레이션이 실행되지 않는다.
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("son");
names.add("kane");
names.add("pogba");
names.add("mata");
//map은 중개 오퍼레이션 -> 출력 x -> 종료형 오퍼레이터가 없다면 map을 시작을 안함
names.stream().map((s)->{
System.out.println(s);
return s.toUpperCase();
});
System.out.println("==================");
names.forEach(System.out::println);
System.out.println("===종료형 오퍼레이션 사용 후===");
// 종료형 오퍼레이션(Collections)를 사용할 경우 map 실행
List<String> collect = names.stream().map((s)->{
System.out.println(s);
return s.toUpperCase();
}).collect(Collectors.toList());
System.out.println("===대문자로 바뀐거 확인===");
//대문자로 바뀐 것도 확인할 수 있다.
collect.forEach(System.out::println);
}
/*
==================
son
kane
pogba
mata
===종료형 오퍼레이션 사용 후===
son
kane
pogba
mata
===대문자로 바뀐거 확인===
SON
KANE
POGBA
MATA
*/
6. 병렬처리가 가능하다.
- 평소에 사용하는 for문으로 단순한 반복문을 해결했지만 조건문이 늘어날수록 복잡해진다.
또한 for문으로는 병렬처리가 불가능하다.
->이런 부분을 stream의 병렬처리로 쉽게 처리할 수 있다. - parallelStream를 이용
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("son");
names.add("kane");
names.add("pogba");
names.add("mata");
// 병럴처리
List<String> collect1 = names.parallelStream().map((s)->{
System.out.println(s+" " + Thread.currentThread().getName());
return s.toUpperCase();
}).collect(Collectors.toList());
collect1.forEach(System.out::println);
}
/*
pogba main
mata ForkJoinPool.commonPool-worker-2
son ForkJoinPool.commonPool-worker-2
kane ForkJoinPool.commonPool-worker-1
SON
KANE
POGBA
MATA
*/
=> 멀티스레드를 사용하는것이 매번 좋지않음!! 데이터가 엄청 많을때 아니면 그냥 stream을 사용하는 것이 더 효율적일 수 있습니다!@~@!
스트림 파이프라인
1. 0이상의 중개 오퍼레이션과 한 개의 종료 오퍼레이션으로 구성
2. 스트림의 데이터 소스는 터미널 오퍼레이션을 실행할 때만 처리
중개 오퍼레이션
- stream을 리턴
- stateless와 stateful로 구분할 수 있음
- filter, map, limit ....
종료 오퍼레이션
- stream을 리턴 x
- collect, allMatch, count, forEach.....
728x90
'자바' 카테고리의 다른 글
자바가상머신 (JVM) (0) | 2021.08.13 |
---|---|
자바 8 stream API (0) | 2021.07.24 |
인터페이스 기본 메소드(Default Methods) (0) | 2021.07.16 |
람다식 매소드 레퍼런스 (0) | 2021.07.13 |
함수형 인터페이스와 람다표현식 (0) | 2021.07.13 |
댓글