스트림은 데이터 소스의 종류에 상관 없이, 데이터를 다루는데 자주 사용되는 메서드를 정의해 놓은 인터페이스이다.
String[] arr = {"a","b","c"}
List<Stirng> list = Arrays.asList(arr);
// 스트림의 생성
Stream<String> stream1 = list.stream();
Stream<String> stream2 = Arrays.stream(arr);
// 스트림의 출력
stream1.forEach(System.out::print);
stream2.forEach(System.out::print);
위와 같이 두 스트림의 데이터 소스는 다르지만, 출력하는 방법은 완전히 동일하다.
매개변수 안의
System.out::println은(str)->System.out.println(str)의 람다식과 같다.
데이터 소스를 변경하지 않는다.
데이터 소스로부터 데이터를 읽기만 할 뿐, 데이터 소스를 변경하지 않는다.
일회용이다.
Iterator 처럼 일회용이다. 한번 사용하면 닫혀서 다시 사용할 수 없다.
stream.forEach(System.out::println);
// int numOrStr = stream.count(); -> 에러. 스트림이 이미 닫혔음.
작업을 내부 반복으로 처리한다.
forEach() 메서드 내부를 보면 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용한다.
이렇게 메서드 내부에 반복문을 정의해 좀 더 간결하게 코드를 작성할 수 있는 것이다.
for(String str : strList){
System.out.println(str);
}
// stream을 이용한 간결한 반복
stream.forEach(System.out::println);