[JAVA] Stream

AI 개발자 웅이·2022년 7월 14일
0

Java

목록 보기
10/11

스트림(stream)은 배열, 컬렉션 등의 자료를 더 효율적으로 일관성 있게 연산 처리를 하도록 도와주는 Java 내장 클래스이다.

스트림의 특징

  1. 자료의 대상과 관계 없이 동일한 연산을 수행한다.
    배열, 컬렉션을 대상으로 동일한 연산을 수행한다. 일관성 있는 연산으로 자료의 처리를 쉽고 간단하게 한다.

  2. 한 번 생성하고 사용한 스트림은 재사용 할 수 없다.
    자료에 대한 스트림을 생성하여 연산을 수행하면 스트림은 소모된다. 다른 연산을 위해서는 새로운 스트림을 생성해야 한다.

  3. 스트림 연산은 기존 자료를 변경하지 않는다.
    자료에 대한 스트림을 생성하면 별도의 메모리 공간을 사용하므로 기존 자료를 변경하지 않는다.

  4. 스트림 연산은 중간 연산과 최종 연산으로 구분된다.
    스트림에 대해 중간 연산은 여러 개 적용될 수 있지만, 최종 연산은 마지막에 한 번만 적용된다. 최종 연산이 호출되어야 중간 연산의 결과가 모두 적용된다. 이를 '지연 연산'이라고 한다.

스트림의 사용법

예제를 통해 스트림의 사용법을 알아보자.

Array(배열) stream 사용 예제

import java.util.Arrays;
import java.util.stream.IntStream;

public class IntArrayTest {

	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, };
		
        // 배열 stream 생성
		IntStream stream = Arrays.stream(arr);
		int sum = stream.sum();
		System.out.println(sum);

		int count = (int) Arrays.stream(arr).count();
		System.out.println(count);
	}

}

ArrayList(컬렉션) stream 사용 예제

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

public class ArrayListTest {

	public static void main(String[] args) {
		List<String> sList = new ArrayList<String>();
		sList.add("Tomas");
		sList.add("James");
		sList.add("Edward");
		
        // 컬렌션 stream 생성
		Stream<String> stream = sList.stream();
		stream.forEach(s -> System.out.println(s));

		// 중간 연산 포함
		sList.stream().sorted().forEach(s -> System.out.println(s));

	}
}

reduce() 연산

reduce() 연산은 정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용한다. 최종 연산으로 스트림의 요소를 소모하며 연산을 수행한다.

reduce() 문법

Arrays.stream(arr).reduce(0, (a, b) -> a + b)

첫번째로 받는 인자는 초깃값, 두번째로 받는 인자는 람다 표현식인데 이 람다 표현식에 따라 다양한 기능을 하는 stream을 구현할 수 있다.

아래는 String array에서 가장 긴 string을 찾는 stream을 구현한 예제이다.

public class ReduceTest {

	public static void main(String[] args) {

		String[] greetingStrings = { "안녕하세요", "HELLO", "Good morning", "반갑습니다" };

		System.out.println(Arrays.stream(greetingStrings).reduce("", (s1, s2) -> {
			if (s1.getBytes().length >= s2.getBytes().length) {
				return s1;
			} else
				return s2;
		}));
	}
}

또한, class를 따로 구현하고 reduce() 두번째 인자에 인스턴스 형식으로 받아서 사용할 수 있다.

class CompareString implements BinaryOperator<String> {
	@Override
	public String apply(String s1, String s2) {
		if (s1.getBytes().length >= s2.getBytes().length) {
			return s1;
		} else
			return s2;
	}
}
public class ReduceTest {

	public static void main(String[] args) {
		String[] greetingStrings = { "안녕하세요", "HELLO", "Good morning", "반갑습니다" };

		String str = Arrays.stream(greetingStrings).reduce(new CompareString()).get();
		System.out.println(str);

	}
}

두 예제 모두 'Good morning'이 출력된다.

profile
저는 AI 개발자 '웅'입니다. AI 연구 및 개발 관련 잡다한 내용을 다룹니다 :)

0개의 댓글