Back-end

스트림 (Stream) - JAVA 8

elysia365 2021. 5. 15.

 

스트림이란?

 - 스트림은 반복자이다. 

 - 컬렉션 또는 배열의 요소를 하나씩 참조하여 람다식으로 처리할 수 있는 반복자이다.

 - Java7 이전까지는 외부반복자인 Iterator 를 사용했지만, Java8 이후부터는 내부반복자인 Stream 을 사용할 수 있다.

public class IteratorVsStreamExample {

	public static void main(String[] args) {
		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(s->System.out.println(s));
	}

}

 스트림 특징
  - 람다식으로 요소처리 코드를 제공한다.
  - 스트림이 제공하는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개타입을 가진다.
  - 매개값으로 람다식 또는 메소드 참조를 대입할 수 있다.

 

public class LambdaExpressionsExample {

	public static void main(String[] args) {
		List<Student> list = Arrays.asList(
				new Student("이진웅", 90),
				new Student("김동현", 91)
		);
		
		Stream<Student> stream = list.stream();
		stream.forEach(s->{
			String name = s.getName();
			int score = s.getScore();
			System.out.println(name + "-" + score);
		});
	}

}

 

스트림 장점 

 - 내부 반복자를 사용하므로 병렬 처리가 쉽다. 
 
   * 외부 반복자 : 개발자가 코드로 직접 컬렉션 요소를 반복해서 요청하고 가져오는 코드 패턴 (e.g. Iterator)
   * 내부 반복자 : 컬렉션 내부에서 요소들을 반복시키고 개발자는 요소당 처리해야할 코드만 제공하는 코드 패턴

   
 내부 반복자의 이점
   - 개발자는 요소 처리 코드에만 집중
   - 멀티 코어 CPU 를 최대한 활용하기 위해 요소들을 분배시켜 병렬 처리 작업을 할 수 있다. 

   - 외부 반복자 (e.g. Iterator) 를 사용하면서 병렬 처리를 하기 위해서는 Thread 처리 로직을 별도 구현해야한다.
 
 스트림의 병렬 처리 방법
   - 한가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리한 후, 서브 작업들의 결과들을 최종 결합하는 방법
   - 자바는 ForkJoingPool 프레임워크를 이용해서 병렬 처리를 한다.

   - 개발자가 Thread 처리 로직을 개발할 필요가 없다.

 

출처 : 한빛미디어 - 이것이 자바다.

 

public class ParallelExample {

	public static void main(String[] args) {
		List<String> list = Arrays.asList("이진웅","조영찬","김동현","유민규","양희정");
		
		// 순차처리
		Stream<String> stream = list.stream();
		// stream.forEach(s->print(s)); // 람다표현식 방식
		stream.forEach(ParallelExample::print); // 메소드 참조 방식
		
		System.out.println();
		
		// 병렬처리
		Stream<String> parallelStream = list.parallelStream();
		parallelStream.forEach(ParallelExample::print);
	}
	
	public static void print(String str) {
		System.out.println(str + ":" + Thread.currentThread().getName());
	}

}
console 출력결과

이진웅:main
조영찬:main
김동현:main
유민규:main
양희정:main

김동현:main
양희정:ForkJoinPool.commonPool-worker-3
이진웅:ForkJoinPool.commonPool-worker-3
조영찬:ForkJoinPool.commonPool-worker-5
유민규:ForkJoinPool.commonPool-worker-7

 

스트림은 중간 처리와 최종 처리를 할 수 있다. 
 - 중간처리 : 요소들의 매핑, 필터링, 정렬
 - 최종처리 : 반복, 카운트, 평균, 총합 

 

출처 - 한빛미디어 이것이 자바다.

public class MapAndReduceExample {

	public static void main(String[] args) {
		List<Student> studentList = Arrays.asList(
				new Student("이진웅", 90),
				new Student("김동현", 80),
				new Student("조영찬", 100)
		);
		
		double avg = studentList.stream()
				.mapToInt(s->s.getScore())
				.average()
				.getAsDouble();
		
		System.out.println(avg);
	}

}

'Back-end' 카테고리의 다른 글

Oracle SQL을 MySQL로 전환하기  (0) 2024.05.21
Snowflake ID Generator  (0) 2023.04.16
Javascript 에서 9천조 이상의 숫자를 다룰때 고민할 부분  (0) 2023.04.13
Java 메모장  (0) 2021.05.16
JAVA...  (0) 2021.04.21

댓글