Stream API???
람다를 활용해서 배열이나 Collection 자료구조들을 딸깍(?)할 수 있게 만들어주는 API다.
데이터의 CRUD가 필요할 때, for문을 이용하거나, Iterator를 사용하는 방식이 있었지만 코드가 길어지고,
타입마다 다르게 다뤄야 하는 불편함을 해결하기 위해 나왔다.
데이터를 다루는데 자주 사용되는 메서드를 미리 정의해 놓았기 때문에 사용자는 메서드만 주렁주렁 달면
쉽게 다룰 수 있는 그런 API가 되시겠다.
Stream의 특징
- 생성 - 중간 처리 - 최종 처리 순서로 이어진다.
- 원본 데이터를 건드리지 않는다. 각 단계가 끝날 때마다 만들어진 처리를 다음 메서드에 넘기는 방식이다.
- 최종 처리가 끝나면 다시 중간처리로 갈 수 없고, 재사용이 불가능하다.
- 중간 처리는 최종 처리가 진행될 때까지 지연된다.
Stream의 생성
이외에도
Stream <Integer> s = Stream.iterate(2, n->n+2). limit(3); // 2,4,6
Stream <String> s = Stream.generate(() ->"a"). limit(5); // a, a, a, a, a
으로 생성도 가능하다.
Stream의 처리
중간 처리
distinct() // 중간처리
filter() // 스트림 내 요소를 평가, if문
skip(n) // 앞에서부터 n개만큼 스킵
Mapping // 특정 타입(값)으로 변환할 때 사용
최종 처리
Match // 특정 조건을 만족하는 요소를 체크
allMatch // 모두 만족하는지
anyMatch // 하나라도 있는지
noneMatch // 모두 만족하지 않는지
collect() //스트림 요소를 원하는 자료형으로 변환
forEach() // 스트림 값을 하나하나 참조
reduce() // 스트림의 요소를 하나씩 줄이기