자료의 대상과 관계 없이 동일한 연산을 수행
배열이건, ArrayList건 상관 없이 동일한 방식으로 연산된다
배열, 컬렉션을 대상으로 연산
자료처리에 대한 추상화가 구현되었다고 한다
한 번 생성하고 사용한 스트림은 재사용할 수 없다
자료에 대한 스트림을 생성하여 연산을 수행했다면 스트림은 소모되고
다른 연산을 하기 위해서는 다시 생성해야 한다
스트림은 기존 자료를 변경하지 않는다
자료에 대한 스트림을 생성하면 스트림이 사용하는 메모리 공간은 별도로 생성되므로 연산이 수행되어도 기존 자료에 대해 변경되지 않는다
스트림의 연산은 중간 연산과 최종 연산으로 구분된다
중간 연산은 여러 연산이 적용될 수 있지만 최종 연산은 마지막에 한 번 적용된다
최종 연산이 호출되어야 중간 연산에 대한 수행이 이루어지고 결과가 생성된다
그래서 중간 연산에 대한 결과를 연산 중간에 알 수 없다
이를 지연 연산 이라고 한다
intArray 예제
int 형 array 만들고 각각의 요소를 출력 (forEach()사용)
int[] arr = {1, 2, 3, 4, 5};
for(int num : arr){
System.out.println(num);
}
System.out.println();
Arrays.stream(arr).forEach(n -> System.out.println(n));
IntStream is = Arrays.stream(arr); // IntStream을 반환함
// Stream에 있는 메서드들은 자료형에 관계 없이 대부분 똑같음
is.forEach(n -> System.out.println(n)); //위에서 생성한 is로 연산을 한 번 하면
//is. 다시 못한다. 소모 되었다. 또 생성해야 한다.
int sum = Arrays.stream(arr).sum();
System.out.println(sum);
List<String> sList = new ArrayList<String>();
sList.add("Tomas");
sList.add("Edward");
sList.add("Jack");
Stream<String> stream = sList.stream();
stream.forEach(s -> System.out.println(s));
sList.stream().sorted().forEach(s -> System.out.print(s + "\t"));
System.out.println();
sList.stream().map(s -> s.length()).forEach(s -> System.out.print(s + "\t"));
System.out.println();
sList.stream().filter(s -> s.length() >= 5).forEach(s-> System.out.println(s));