Stream: 자바8부터 추가된 기능입니다.
기존에 배열의 원소, 혹은 Collection을 가공할 때는 forEach(), 혹은 for문을 통해 하나씩 가공을 진행했지만, Stream을 사용하면 람다함수형식을 통하여 깔끔하게 한번에 가공할 수 있게 되었습니다.
가공하는 방식에는 Map, Filter, Sorted 등이 존재합니다.
1. Stream 생성
[콜렉션 -> 스트림]
List, Set과 같이 Collection 인터페이스를 구현한 객체는 .stream()을 통해서 변경가능하다.
// List로부터 스트림을 생성
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> listStream = list.stream();
[배열 -> 스트림]
Stream의 of() 메소드, 혹은 Arrays의 stream() 메소드를 통해서 stream으로 변환한다.
// 배열로부터 스트림을 생성
Stream<String> stream = Stream.of("a", "b", "c"); //가변인자
Stream<String> stream = Stream.of(new String[] {"a", "b", "c"});
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"});
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"}, 0, 3); //end범위 포함 x
[원시 스트림 생성]
Int, Long, Double과 같은 원시 자료형을 사용하기 위해서 IntStream, LongStream, DoubleStream 등을 사용할 수 있다.
IntStream은 range()함수를 통해 기존의 for문을 대체해서 사용 가능하다.
// 4이상 10 이하의 숫자를 갖는 IntStream
IntStream stream = IntStream.range(4, 10);
[ Stream 가공 ]
Stream을 사용하는 이유는 여러가지 데이터가 들어있는 객체의 모든 요소들을 [가공] 하기 위해서다.
가공의 종류는 다음과 같다.
[Filtering]
Stream내에서 특정 조건을 지닌 값들만 필터링하는 메소드이다.
Stream<String> stream =
list.stream()
.filter(title -> title.contains("code"));
filter() 내부에 람다함수로 filter 함수를 구현하면, 모든 요소에 적용된다.
위의 경우, Stream내의 값들 중 title에 "code"라는 내용이 들어가있는 값만 남기는 필터링이다.
[Map]
Stream 내의 값들을 변환하여 새로운 Stream을 생성하는 메소드이다.
Stream내의 값들을 특정한 형태로 변환하는데 사용한다.
예를 들어 Stream내의 모든 소문자를 대문자로 변환하는 등의 경우에서 사용 가능하다.
Stream<String> stream =
title.stream()
.map(s -> s.toUpperCase());
위의 코드는 스트림내의 값들의 title을 모두 대문자로 적용하는 map 메소드이다.
public Book toEntity() {
return new Book(itemId, isbn, title, author, description, pubDate, coverSmallUrl, coverLargeUrl, categoryName, categoryId, rank);
}
......
public List<Book> ListDtoToListEntity(List<Item> item){
return item.stream()
.map(Item::toEntity) //이런식으로 객체 -> 변환 함수 적용하는 것도 가능하다.
.collect(Collectors.toList());
}
[Sorted]
Stream내의 요소들을 정렬하기 위해 사용한다. 디폴트값은 오른차순이고, 만약 파라미터로 정렬 타입을 넘긴다면, 적절한 정렬 방식을 사용할 수 있다.
List<String> list = Arrays.asList("apple", "banana", "car");
Stream<String> stream = list.stream()// 디폴트: 오름차순
.sorted()
Stream<String> stream = list.stream()
.sorted(Comparator.reverseOrder())// 파라미터로 reverseOrder사용, 오름차의 반대인 내림차순 정렬
[Distinct]
Stream내의 중복값을 제거한다.
List<String> list = Arrays.asList("apple", "apple", "banana", "car");
Stream<String> stream = list.stream()
.distinct()//중복된 "apple"을 제거한다.
[ Stream 추출 ]
Stream내에서 원하는 값을 가져오는 메소드 역시 존재한다.
Max,Min,Sum,Average,Count가 있으며, 각각 최대값, 최소값, 총 합, 평균, 개수를 반환한다.
long count = IntStream.of(1, 2, 3, 4, 5).count();
long sum = LongStream.of(1, 2, 3, 4, 5).sum();
[ Collection]
문자 그대로, 값을 수집하는데 쓰인다.
collect() -> 스트림 최종연산. 파라미터로 Collector를 전달해야한다.
ex) Object collect(Collector collector)
Collector -> collect의 파라미터가 구현해야하는 인터페이스
Collectors -> satic 메소드로 미리 작성된 Collector를 제공하는 클래스
보통 Stream을 List로 받는 등, 자주 사용하는 수집 방식은 Collectors.toList()와 같이 제공되있는 Collector를 사용할 수 있다.
List<Tuple> result=tuple.fetch(); //result가 Tuple이라는 타입의 객체를 가진 List라는 것만 보자
result.stream().map(t -> t.toArray()).collect(Collectors.toList())
위 코드는 result라는 Tuple타입을 모아둔 List를 스트림으로 변환하고, 각각의 Tuple 객체에 대해 Map을 통해
Tuple -> Array
변환을 진행한다.
이후 .collect()의 인자로 Collectors.toList()라는 제공되는 Collector를 넘겨주어 다시 Stream을 List로 변환하는 코드이다.
'Spring boot' 카테고리의 다른 글
Spring 소셜 로그인 처리 [OAuth] (0) | 2023.01.26 |
---|---|
Spring security란? (0) | 2023.01.25 |
[toyProject] 게시물 사이트 Part 3 (0) | 2023.01.10 |
[toyProject] 게시물 사이트 Part 2 (0) | 2023.01.10 |
[toyProject] 게시물 사이트 Part 1 (0) | 2023.01.10 |