내로그
Java Stream(스트림) 본문
스트림이란?
- 스트림은 반복자
컬렉션(배열 포함)의 요소를 하나씩 참조해서 람다식으로 처리할 수 있는 반복자이다.
List<String> list = Arrays.asList("김씨","박씨","전씨");
// Iterator 이용
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String name = iterator.next();
System.out.println(name);
}
// Stream 이용
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
스트림 특징
람다식으로 요소 처리 코드를 제공
- 스트림이 제공하는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개타입을 가진다.
- 매개값으로 람다식 또는 메소드 참조를 대입할 수 있다.
List<Student> list = Arrays.asList(
new Student("김씨",99),
new Student("서씨",100)
);
Stream<Student> stream = list.stream();
stream.forEach(student ->{
String name = student.getName();
int score = student.getScore();
System.out.println("학생:"+name+" 점수:"+score);
});
내부 반복자를 사용하므로 병렬 처리가 쉽다.
- 외부 반복자
개발자가 코트로 직접 컬렉션 요소를 반복해서 요청하고 가져오는 코드패턴 ex) iterator 사용시 while문으로 next()로 요소를 가져옴
-내부 반복자
개발자는 요소 처리 코드에만 집중
멀티 코어 CPU를 최대한 활용하기 위해 요소들을 분배시켜 병렬 처리 작업을 할 수있다.
- 병렬(parallel) 처리
한가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리한 후, 서브 작업들의 결과들을
최종 결합하는 방법
자바는 ForkJoinPool 프레임워크를 이용하여 병렬 처리를 한다.
ForkJoinPool은 하나의 task(처리할일) 을 Fork 로 여개로 나눠서 처리한 후 Join으로 처리결과를 합치고
최종 결과물을 만들어낸다.
List<String> list = Arrays.asList("김씨","전씨","강씨","조씨","정씨");
// 순차 처리
Stream<String> stream = list.stream();
stream.forEach( name ->{
stop(500);
System.out.println(name+"---"+ print());
});
// 병렬 처리
Stream<String> parallelStream = list.parallelStream();
parallelStream.forEach(name->{
stop(500);
System.out.println(name+"---"+ print());
});
순차 처리시 하나의 쓰레드로 처리 하기때문에 하나의 처리시간 * 처리할 작업량 만큼의 시간이 걸린다. ( 처리시간=0.5 * 5 = 2.5초)
병렬 처리시 여러개의 쓰레드로 작업하기 때문에 총 처리 시간이 투입되는 쓰레드가 많을 수록 줄어든다. (처리시간=쓰레드 5개일시 0.5초)
스트림의 종류
- BaseStream : 모든 스트림에서 사용할 수 있는 공통 메소드들이 정의되어 있음, 코드로 사용되지는 않음
- Stream : 객체 요소를 처리하는 스트림
- IntStrem : int 처리 스트림
- LongStrem : long 처리 스트림
- DoubleStream : double 처리 스트림
스트림 구현 객체를 얻는 방법
'WEB > Java' 카테고리의 다른 글
Java Stream(스트림) 중간처리, 최종처리 메소드 (0) | 2022.08.25 |
---|---|
Java Stream(스트림) 파이프라인 (0) | 2022.08.24 |
람다식(Lambda) (0) | 2022.08.23 |