Java 8에 도입된 기능으로 데이터의 흐름을 다루기 위한 선언형 API다.
스트림을 사용하여 필터링, 매핑, 정렬 등 다양한 데이터 처리 작업을 적용할 수 있으며 최종 결과를 배열이나 컬렉션으로 변환할 수 있다.
스트림은 데이터 처리 작업을 연속적인 파이프라인으로 나타낼 수 있어 가독성이 높고 병렬 처리를 쉽게 구현할 수 있다.

중간 연산은 스트림을 처리하고 다른 스트림을 반환하는 반면 최종 연산은 스트림을 처리하고 결과를 반환한다.배열을 스트림으로 변환한다는 것은 배열의 원소들을 스트림 형태로 변환하여 처리할 수 있게 하는 것이다. 스트림은 원본 데이터를 변경하지 않고 필요한 데이터 처리 작업을 적용한 결과를 생성하기 때문에 인덱스를 통한 직접 접근은 제공하지 않는다.
stream() 배열을 스트림으로 변환 int[] numbers = {1,2,3,4,5};
IntStream stream = Arrays.stream(numbers);
filter() 스트림을 통해 필터링 작업 및 데이터 처리 작업 IntStream evenStream = stream.filter(n->n%2==0); // 중간 연산, 람다식 사용
int evenSum = evenStream.sum(); // 최종 연산
// ==> int evenSum = stream.filter(n->n%2==0).sum();
System.out.println(evenSum);
toArray() 스트림을 배열로 변환 int[] numbers = {1,2,3,4,5};
IntStream stream = Arrays.stream(numbers);
IntStream evenStream = stream.filter(n->n%2==0);
// [2, 4]
System.out.println(Arrays.toString(evenStream.toArray()));
interface FilterEven{
boolean isEven(int n);
}
public class ArrayStreamEx {
public static boolean isEvenStatic(int n){
return n % 2 == 0;
}
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
// 객체 n의 조건자 boolean값을 반환하는 함수형 인터페이스
Predicate<Integer> isEven = n -> n%2 == 0;
FilterEven fe = n -> n%2 == 0;
int sumOfsquares = numbers.stream()
.filter(isEven) // 짝수 스트림 필터
// .filter(fe::isEven) 같은 표현
// .filter(ArrayStreamEx::isEvenStatic) 같은 표현
.sorted() // 스트림 정렬
.map(n->n*n) // 모든 원소를 제곱함
.reduce(0, Integer::sum); // 초기값 0에 원소들을 순차적으로 더함(누적합)
System.out.println("짝수 제곱의 합: "+sumOfsquares);
}
}
List<String> words = Arrays.asList("apple", "banana", "cherry", "orange");
List<String> uppercaseWords = words.stream()
.map(n -> n.toUpperCase())
.collect(Collectors.toList());
// 대문자로 변환한 리스트: [APPLE, BANANA, CHERRY, ORANGE]
System.out.println("대문자로 변환한 리스트: "+uppercaseWords.toString());