관리 메뉴

나만의공간

Java Stream 소개 #1 본문

IT/JAVA

Java Stream 소개 #1

밥알이 2024. 2. 27. 10:16

Stream은 Java 8에서 신규로 추가된 메이져 기능 중 하나로 java.util.stream 클래스에 포함되어 있는 기능입니다.
Stream은 다양한 요소에서 생성이 될수 있는데 stream() 과 of() 메서드를 사용하여 컬렉션 또는 배열을 생성하게 됩니다.

Stream 기본 형태

import java.util.Arrays;
import java.util.stream.Stream;

public class StreamSample {

	public static void main(String[] args) {
		streamSample1();
	}

	public static void streamSample1() {
		// 배열 Stream 객체 변환
		String[] array = new String[]{"a","b","c"};
		Stream<String> stream = Arrays.stream(array);
		System.out.println("배열 Stream 객체 변환값 출력");
		stream.forEach(System.out::println);
		System.out.println();

		// Stream 객체 생성
		stream = Stream.of("a","b","c");
		System.out.println("Stream 객체 출력");
		stream.forEach(System.out::println);


	}
}

출력결과

배열 Stream 객체 변환값 출력
a
b
c

Stream 객체 출력
a
b
c

 

  • Stream 메서드는 Collection 객체를 Interface하기 때문에 아래와 같이 List객체를 Stream객체로 변환해서 담을수도 있습니다.
  • addValueToList 메서드는 List객체에 초기값을 적재하기 위해 만든 메서드 입니다.
package jpabook.jpashop.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class StreamSample2 {

	public static void main(String[] args) {
		List<String> list1 = new ArrayList<>();
		addValuesToList(list1, "가", "나", "다", "라", "마", "바", "사", "아", "자", "차");
		Stream<String> stream2 = list1.stream();
		System.out.println("List객체를 Stream객체로 이동시킨 후 출력");
		stream2.forEach(System.out::println);
	}

	public static void addValuesToList(List<String> list, String... values) {
		for (String value : values) {
			list.add(value);
		}
	}
}

Stream 멀티 쓰레딩 기능

Stream API는 간단한 멀티 쓰레딩 기능을 제공합니다. parallelStream() 메서드를 사용하면됩니다.
아래 코드는 doWork()이란 메서드를 Parallel로 실행하게 됩니다.

package jpabook.jpashop.stream;

import java.util.stream.IntStream;
import java.util.stream.Stream;

public class StreamSample3 {

	public static void main(String[] args) {
		//rangeClose 범위 정수 스트림을 생성 메소드
		Stream<Integer> intStream = generateStream(1,5);
		System.out.println("Parallel Stream 출력");
		intStream.parallel().forEach(element -> doWork(element));

		Stream<Integer> intStream2 = generateStream(1,5);
		System.out.println("일반적인 Stream 출력");
		intStream2.forEach(element -> doWork(element));

	}

	public static Stream<Integer> generateStream(int startNum, int endNum) {
		return IntStream.rangeClosed(startNum, endNum).boxed();
	}

	public static void doWork(Integer num) {
		System.out.println(num);
	}
}

출력값
출력된 값을 보면 순차 출력이 안되고 parallel로 인하여 무작위로 출력이 되고 있다.

Parallel Stream 출력
3
4
1
2
5
일반적인 Stream 출력
1
2
3
4
5

Collectting (수집)

  • Stream의 collect() 메서드는 collection이나 Map으로 변환하고 Stream을 단일 문자열 형식으로 표현하는데 매우 편한 기능을 제공합니다. 
  • 아래 코드는 Stream<String> 객체를 List<String> 객체로 변환하는 것을 보여 줍니다.
package jpabook.jpashop.stream;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamCollection {

	public static void main(String[] args) {
		// GDP가 높은 순으로 나라 이름을 한글로 번역하여 Stream 객체 생성
		Stream<String> countryNames = Stream.of(
			"United States", "China", "Japan", "Germany", "India",
			"United Kingdom", "France", "Brazil", "Italy", "Canada",
			"Russia", "South Korea", "Spain", "Australia", "Mexico",
			"Indonesia", "Netherlands", "Saudi Arabia", "Turkey", "Switzerland"
		);

		// stream객체에 있는 나라 이름을 모두 대문자로 변경하여 List객체로 변환
		List<String> countryList = countryNames.map(element -> element.toUpperCase()).collect(Collectors.toList());

		countryList.forEach(element-> System.out.print(element+" "));
	}
}

결과

UNITED STATES CHINA JAPAN GERMANY INDIA UNITED KINGDOM FRANCE BRAZIL ITALY CANADA RUSSIA SOUTH KOREA SPAIN AUSTRALIA MEXICO INDONESIA NETHERLANDS SAUDI ARABIA TURKEY SWITZERLAND

 

Comments