stream()
스트림(Stream) : 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것
- 자바 1.8 이전에는 다양한 컬렉션 클래스들이 서로 사용방이 달라서 표준화가 제대로 이뤄지지 않았었는데 자바 1.8이 등장하면서 표준화가 완벽하게 이뤄짐.
자바8부터 Stream 을 사용 할 수 있습니다.
기존에 자바 컬렉션이나 배열의 원소를 가공할떄, for문, foreach 등으로 원소 하나씩 골라내여 가공을 하였다면,
Stream 을 이용하여 람다함수 형식으로 간결하고 깔끔하게 요소들의 처리가 가능합니다.
배열의 원소를 가공하는데 있어
map, filter, sorted 등 이 있습니다.
map은 요소들을 특정조건에 해당하는 값으로 변환해 줍니다.
요소들을 대,소문자 변형 등 의 작업을 하고 싶을떄 사용 가능 합니다.
public List<PostResponse> getList() {
return boardRepository.findAll().stream()
.map(springBoard -> PostResponse.builder()
.title(springBoard.getTitle())
.content(springBoard.getContent())
.build())
.collect(Collectors.toList());
}
내 해석 : springBoard로 값을 넘기지 않고, 서비스 정책 기능이 담긴 PostResponse 객체로 변환해서 반환해주겠다라는 의미로 해석할 수 있겠고,
복수의 데이터들을 리스트로 반환해야 하므로 stream 객체를 리스트로 변환해주는 기능인 collect(Collectors.toList())를 사용한 것이다.
만약에 stream() 형식이 아니라 내가 직접 iter 문을 작성해서 springBoard 데이터 값을 리스트로 변경해주고 싶다면 아래와 같이 로직을 구현하면 된다.
List<PostResponse> postResponses = new ArrayList<>();
for(SpringBoard springBoard : boardRepository.findAll()){
PostResponse postResponse = PostResponse.builder()
.id(springBoard.getId())
.title(springBoard.getTitle())
.content(springBoard.getContent())
.build();
postResponses.add(postResponse);
}
return postResponses;
stream()을 사용하면 for문과 데이터를 담을 Arraylist<>를 생성하지 않아도 되는 간편함과 가독성도 더 좋아지는듯 하다.
배열에서 가장 큰 값을 반환해주는 stream 메소드
int lt = Arrays.stream(arr).max().getAsInt();
getAsInt()를 선언 해주지 않으면 Optional int로 값이 반환되기 때문에 getAsInt() 형변환이 필요하다.
배열의 모든 값을 더해주는 steam 메소드
int rt = Arrays.stream(arr).sum();
stream().sum()은 기본형을 반환해주기 때문에 getAsInt()를 선언해주지 않아도 된다.
위처럼 stream() 메서드를 사용하여 배열의 가장 큰 값 또는 배열을 모두 더한 값을 구할 때 내부 반복자를 쓰기 때문에 효율성도 더 뛰어날 것으로 예측된다.
IntStrema.range().mapToObj().collect
List<SpringBoard> requestPosts = IntStream.range(1, 31)
.mapToObj(i -> SpringBoard.builder()
.title("제목 : " + i)
.content("내용 : " + i)
.build())
.collect(Collectors.toList());
IntStream을 Stream 형식으로 바꿀 때 mapToObj를 사용한다.
Stream으로 바꾸는 이유는 컬렉션의 다양한 클래스들 마다 각기 다른 방식으로 처리해주는 것을 방지시켜주기 때문이다.