-
자바의 Stream이란?Language/JAVA 2022. 11. 29. 14:13728x90
스트림(Stream)이란
- 자바 8 에서 추가된, 람다를 활용하는 기술이다.
- 람다식이란, 함수형 인터페이스의 구현 객체를 간결하게 표현하는 표현식이다.
List<String> list = List.of("귀여운", "고양이"); // arr를 오름차순으로 정렬 Collections.sort(arr, (s1,s2) -> s2.compareTo(s1))
- 자바 8 이전에는 컬렉션을 다룰 때 for문을 통해 다뤄야했기 때문에 로직이 복잡해 질 수록 여러 로직이 섞이면서 가독성이 떨어지는 문제가 있었는데, 이러한 문제들을 해결할 수 있게 되었다.
- 스트림은 다음과 같은 특징이 있다.
- 데이터 소스를 추상화하여 데이터를 다루는 방법들을 공통화하였다.
- List의 정렬은 Collections.sort()를 사용하고, Array를 정렬 할 때에는 Arrays.sort()를 사용해야 하는데 이들을 추상화하여 Stream.sort()를 사용한다.
- 데이터를 담고 있는 저장소, 즉 컬렉션이 아니다.
- 원본 데이터 소스를 변경하지 않는다.
- Iterator처럼 일회용이다. 즉, 매번 다시 생성해야 한다.
- 최종 연산을 수행하기 전까지 중간 연산은 수행되지 않으며(Lazy evaluation), 무제한으로 생성이 가능하다.
- 병렬처리가 가능하다.
- 데이터 소스를 추상화하여 데이터를 다루는 방법들을 공통화하였다.
스트림 사용 방법
스트림 생성
- Collection으로부터 스트림을 생성
Stream<Integer> intStream = Arrays.asList(1,2,3).stream(); Stream<String> strStream = Arrays.asList("귀여운", "고양이").stream();
스트림 중간연산(intermediate operations)
- 스트림의 중간연산은 연산 결과를 스트림으로 반환하기 때문에, 중간연산을 무한으로 사용할 수 있다.
.distinct() // 중복 제거 .filter(Predicate<T> predicate) // 조건에 맞지 않는 요소를 제외 .limit(long maxSize) // maxSize 이후 요소는 없앤다. sorted() // 기본 오름차순 정렬 sorted(Comparator<T> comparator) // 조건에 맞게 요소를 정렬 //스트림의 요소를 반환한다. ex) map(File::getName), map(s->s.subString(3)) 등 .map(Function<T,R> mapper)
스트림 최종연산(terminal operations)
- 스트림의 최종연산은 스트림의 요소를 소모하기 때문에 단 한 번만 사용이 가능하다.
void forEach(Consumer<? super T> action) // 각 요소에 대해 작업 수행 long count() // 스트림 요소 갯수 반환 Optional<T> max(Comparator<? super T> comparator) // 최댓값 반환 Optional<T> max(Comparator<? super T> comparator) // 최솟값 반환 Optional<T> findAny() // 아무거나 한 개를 반환 Optional<T> findFirst() // 가장 처음 스트림 요소를 반환 Object[] toArray() // 스트림의 모든 요소를 배열로 반환
- 또한 최종 연산 중에서도 가장 유용하게 쓰일 수 있는 것이 collect()이다.
Stream<String> stuStream = new String[]{new Student("권혁준"), new Student("변성준")); // Student 인스턴스의 이름을 받아 List에 저장 List<String> names = stuStream.map(Student::getName).collect(Collectors.toList()); // Student 인스턴스의 이름을 받아 ArrayList에 저장 ArrayList<String> list = stuStream.map(Student::getName) .collect(Collectors.toCollection(ArrayList::new));
참고
자바의 정석 - 남궁성'Language > JAVA' 카테고리의 다른 글
자바의 직렬화(Serialization)란? (0) 2022.11.29