
대량의 데이터를 가공해서 축소하는 것을 일반적으로 리덕션이라고 합니다.
데이터의 합계, 평균값, 카운팅, 최대값, 최소값 등이 대표적인 리덕션의 결과물이라고 볼 수 있습니다.
그러나 컬렉션의 요소를 리덕션의 결과물로 바로 집계할 수 없을 경우에는 집계하기 좋도록 필터링, 매핑, 정렬, 그룹핑 등의 중간 처리가 필요합니다.


스트림은 크게 세가지 단계에 걸쳐서 동작한다.
- 스트림 생성 : 스트림 인스턴스 생성.
- 스트림 중개 연산(스트림 변환, 가공) : 필터링(filtering) 및 맵핑(mapping) 등 원하는 결과를 만들어가는 중간 작업.
- 스트림 최종 연산(스트림 사용, 결과) : 최종적으로 결과를 만들어내는 작업
배열 스트림
배열 스트림은 Arrays.stream()메소드를 활용하여 생성이 가능하다.
String[] str = new String[]{"1", "2", "3", "4", "5"};
Stream<String> stream = Arrays.stream(str);
Stream<String> subStream = Arrays.stream(str, 3, 5); // 3 ~ (5-1) 요소 [4, 5]
출처 : https://luckyguystory.tistory.com/172
① 중간 함수
② 최종 함수
public class StreamMain {
public static void main(String[] args) {
int[] ar = { 1, 2, 3, 4, 5 };
int sum = Arrays.stream(ar) // 스트림 객체로 바꾼다.
.filter(n -> n % 2 == 1) // 중간 연산 함수
.sum(); // 최종 함수
System.out.println(sum);
String[] names = { "봄", "여름", "가을", "겨울" };
Arrays.stream(names).forEach(s -> System.out.println(s));
double[] ds = {1.1,2.2,3.3,4.4};
Arrays.stream(ds).forEach(d -> System.out.println(d));
List<String> names2 = Arrays.asList("Sehoon", "Songwoo", "Chan", "Youngsuk", "Dajung");
names2.stream()
.map((name)->name.toUpperCase())
.forEach(name -> System.out.println(name));
names2.stream()
.map((name)->name.length())
.forEach(name -> System.out.println(name));
int sum2 = names2.stream()
.mapToInt((name)->name.length())
.sum();
System.out.println("내부에 있는 숫자들을 모두 합하면 ? " + sum2);
names2.stream()
.filter(s -> s.startsWith("S"))
.forEach(name -> System.out.println(name));
List<String> startsWithS = names2.stream()
.filter(s -> s.startsWith("S"))
.collect(Collectors.toList());
System.out.println(
names2.stream()
.filter(s -> s.startsWith("S"))
.collect(Collectors.joining(","))
);
System.out.println(startsWithS);
}
}