스트림은 Java 8 부터 람다를 활용할수 있게 해주는 기술이다. 배열이나 컬렉션에서 정보를 받아 여러가지 표준화된 방법들을 이용해 데이터를 가공할수 있다. 여기서 중요한점은 스트림은 데이터를 받아오는 입장이기 때문에 원본 데이터를 바꾸지 못한다는 겟 이다.
컬렉션 같은 경우 데이터를 가공하기 위해선 외부 반복자(iterator, for, while 등등) 을 사용하여 정보를 하나씩 들추는 반면 스트림에서는 내부 반복자를 이용하여 데이터를 보다 효율적으로 가공할수 있게된다.
스트림은 다음과 같은 단계를 가진다.+ 생성하기 : 스트림 인스턴스 생성
+ 가공하기 : 필터링 및 맵핑등 데이터를 가공하여 원하는 결과물을 만들어가는 과정
+ 결과 만들기 : 데이터 가공의 최종 단계
이러한 과정을 보통 파이프 라인이라고 칭한다.
⭐자주쓰는 Stream method 종류
스트림 생성자+ stream() : 기본적인 컬렉션 객체들을 소스로 하는 스트림을 반환한다.
+ Streams.of() / Arrays.stream : 배열 값을 소스로 하는 스트림을 반환한다. 기본적으로 주어지는 가변 인자들을 배열의 객체로 인식한다.
+ Int/Long/DoubleStream : 원시 자료형 값들을 반환받는 스트림 타입이다.
스트림 가공- 필터링
+ filter() : Stream의 가공중 주어진 조건에 맞는 데이터를 받아 컬렉션을 만들어주는 메서드이다. 필터링의 반환 값이 참일 경우 요소들을 가져온다.
+ distinct() : Stream의 가공 방법중 중복되는 데이터가 있을시 중복을 제거해주는 메서드이다.
- 매핑
+ map() : 스트림에서 주어진 값들이 특정한 조건에 따라 가공된 후 새로운 스트림에 담기게 해주는 메서드이다.
+ flatmap() : 중첩되는 구조를 제거하고 모든 원소를 단일 원소 스트림으로 반환 할수 있다. 특히 초기 스트림이 배열 형태일때 유용하다.
+ sorted() : 아무런 인자 없이 호출할시 오름차순으로 정렬되며 다른 정렬과 마찬가지로 Comparator를 사용한다.
스트림 최종 연산+ forEach() : 스트림의 모든 값을 하나씩 연산해주는 메서드이다.
+ match() : 결과 값이 주어진 조건들과 일치 하는지 boolean 값으로 반환해준다.
+ collect() : 컬렉터 타입의 인자를 받아서 값을 처리해준다. 가공된 데이터의 값을 컬렉터에서 사용된 메서드를 기준으로 받아온다.
드디어 스트림 정리를 시작했다. 연습 문제를 풀때 느낀거지만, 별로 사용해본적이 없는 람다 형태의 코딩이라서 그런지 많이 어색하다. 아직 코딩 실력이 많이 부족해서 그런가... 페어분의 도움으로 간신히 문제를 다 풀긴 했지만, 많은 연습이 필요하다. 많은 스트림 내용중 우선 연습문제에서 활용했던 메서드 중점으로 정리를 해봤다. 아직 정리 못한 내용도 많고 짧게만 정리한 것들도 많아 컬렉션과 같이 주말에 시간이 되면 다시 정리를 해야할 것 같다.