자바를 공부하면서 스트림(Stream)이란 단어는 많이 들어봤다. 하지만 들어보기만 했지 스트림이 어떤건지, 어떻게 사용하는건지 잘 몰라 한번 알아보았다.
한번 예시를 들어보자.
int[] arr = {1,2,3,4,5};
for(int i = 0; i < arr.length(); i++){
System.out.println(arr[i]);
}
위와 같은 코드가 있다고 가정할 때, 스트림을 사용하면 다음과 같이 편리하게 사용 할 수 있다.
int[] arr = {1,2,3,4,5};>Arrays.stream(arr).forEach(i -> System.out.println(i));
이렇게 코드가 간결해진다. 위 예시는 단순한 예제라 그렇지 코드가 매우 복잡해지면 더욱 더 간결해진다.
여기서 중요한 개념이 있다.
최종 연산은 마지막에 한번만 호출된다 !
최종 연산이 호출 되어야 중간 연산의 결과가 만들어진다 !
filter()
filter()는 조건을 넣고 조건에 맞는 참인 경우만 추출하는 함수이다.
예시로 문자열의 길이가 5 이상인 경우만 출력하는 코드는 다음과 같다.sList.stream().filter(s -> s.length() >= 5).forEach(s -> System.out.println(s));
위 코드를 분석해보자.
filter(s -> s.length() >= 5) //중간 연산이다. lambda식으로 sList에 있는 각각의 원소가 매개변수인 s에 대입되고, 이를 조건식에 부합하는 원소만 반환한다.
forEach(s -> System.out.println(s)); //최종 연산이다. lambda식으로 중간 연산에서 조건에 부합한 원소들만 출력한다.
map()
map()은 요소를 다른 요소로 반환하는데 사용한다. 다른 타입으로 변환할 수도 있고 다른 값으로 반환할수도 있다.
아래는 클래스에서 이름을 가져오는 예시이다.customerList.stream().map(c -> c.getName()).forEach(s -> System.out.printlnt(s)); //customerList c에서 String 타입인 이름을 가져와 출력한다.
int sum = Arrays.stream(arr).sum(); //합계를 반환한다. int count = (int)Arrays.stream(arr).count();//개수를 반환한다(return type이 long이므로 int로 형변환)
이외에도 count(), sum(), max(), min(), average() 등이 있다.
Collection 인터페이스를 구현한 클래스(ex. ArrayList)에서도 Stream을 사용할 수 있는데, Collection 인터페이스 메소드를 살펴보면 다음과 같은 메소드가 있다.
E
> stream() : 스트림 클래스를 반환쉽게 예시를 보며 이해해보자.
Stream<String> stream = sList.stream(); //제네릭을 이용하여 자료형 명시, 스트림 새로 생성
stream.forEach(s -> System.out.println(s)); //최종 연산인 forEach() 사용하여 출력
stream.sorted().forEach(s ->System.out.println(s)); //중간 연산인 sorted()에 의해 정렬되고, 이를 최종 연산인 forEach()로 출력
이렇게 생성된 스트림은 ArrayList의 모든 요소를 가지고 있다. forEach 메소드가 수행되면 요소가 하나씩 차례로 변수 s에 대입되고 이를 매개변수로 받아 출력문이 호출된다.
출처: Do it 자바 프로그래밍 정리