자료의 대상고 관계없이 동일한 연산수행
배열, 컬렉션 대상으로 연산 수행
사용한 스트림은 재사용 안됨
스트림은 사용한 자료 변경이 없다
중간 연산과 최종 연산으로 구분된다
최종연산이 호출되어야 중간 연산에 대한 수행이 이루어진다 따라서 중간연산에 대한 결과를 연산 중에 알 수 없다
Arrays.stream 에 배열을 넣으면 IntStream 반환하고 IntStream 의 forEach 를 호출 하게 되고 파라미터로 람다식으로 구현한다
public class MyStreamTest {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
Arrays.stream(arr).forEach(n-> System.out.println(n));
IntStream istream = Arrays.stream(arr);
istream.forEach(n-> System.out.println(n));
int sum = Arrays.stream(arr).sum();
}
}
중간 연산의예
filter(), map(), sorted() 등이 있다
예) 문자열 5이상인 원소만 출력. filter 는 중간연산. forEach는 최종연산이다
sList.stream().filter(s->s.length() >= 5).forEach(s->System.out.println(s));
예) 고객 클래스 배열에서 고객 이름만 가져오기. map 은 중간연산 forEach는 최종연산이다
customerList.stream().map(c-c.getName()).forEach(s->System.out.println(s));
중간연산, 최종연산 예제 코드
public class ArrayListStreamTest {
public static void main(String[] args) {
List<String> sList = new ArrayList<>();
sList.add("VanPersie");
sList.add("Mbappe");
sList.add("Griezmann");
sList.add("Debruyne");
Stream<String> stream = sList.stream();
stream.sorted().forEach(s-> System.out.println(s));
System.out.println("===========");
sList.stream().map(s->s.length()).forEach(n-> System.out.println("len: "+n));
System.out.println("===========");
sList.stream().filter(s->s.length() >= 9).forEach(s->System.out.println(s));
}
}
출력결과
Debruyne
Griezmann
Mbappe
VanPersie
===========
len: 9
len: 6
len: 9
len: 8
===========
VanPersie
Griezmann
글자수 길이의 순서를 보면 원본 배열이 변경되지 않았다.
stream.sorted() 가 원본 배열에 영향을 주지 않음을 볼 수 있다