Stream은 java 8부터 추가된 기능으로 컬렉션에 저장된 데이터를 함수형 스타일로 처리할 수 있게 해준다.
여러 가지 자료구조(List, Map, Set)를 제공하며 각각의 특성과 사용법을 이해하고 성능과 사용 목적에 맞게 사용하는 것이 중요하다
(ex. 데이터의 삽입과 삭제가 빈번한 경우 LinkedList를 사용하는 것이 좋고, 검색이 주로 이루어지는 경우에는 ArrayList나 HashMap을 사용하는 것이 효율적이다.)
순서가 있는 데이터의 집합으로, 데이터의 중복을 허용한다.
ArrayList와 LinkedList가 대표적.
ArrayList는 내부적으로 배열을 사용하여 데이터를 관리
LinkedList는 노드의 연결을 통해 데이터를 관리
순서를 유지하지 않으며, 데이터의 중복을 허용하지 않는다.
HashSet과 TreeSet이 대표적.
HashSet은 해싱을 이용해 데이터를 관리
TreeSet은 트리 구조를 이용해 데이터를 관리
키와 값의 쌍으로 데이터를 저장하는 구조. 키의 중복을 허용하지 않으며 각 키는 하나의 값을 가리킨다.
HashMap과 TreeMap이 대표적
HashMap은 해싱을 이요해 데이터를 관리
TreeMap은 트리 구조를 이요해 데이터를 관리
데이터를 필터링, 변환, 집계, 등의 연산을 간결하고 효율적으로 수행할 수 있다. 가장 큰 장점은 코드의 가독성과 유지보수성을 높일 수 있다.
특징: 1회용 !!
Stream<String> strStream1 = strList.stream();
Stream<String> strStream2 = strList.stream();
스트림을 효과적으로 사용하기 위해서는 람다 표현식과 메서드 참조에 대한 이해가 필요하다.
스트림 생성 방법 | 설명 | 예제 |
---|---|---|
Stream.of(T...) | 여러 개의 값을 스트림으로 생성 | Stream.of(1, 2, 3, 4, 5) |
Arrays.stream(T[]) | 배열(Array)에서 스트림 생성 | Arrays.stream(arr) |
List.stream() | 리스트(List)에서 스트림 생성 | list.stream() |
Set.stream() | 집합(Set)에서 스트림 생성 | set.stream() |
Map.entrySet().stream() | 맵(Map)에서 스트림 생성 | map.entrySet().stream() |
IntStream.range(a, b) | a 부터 b-1 까지의 숫자 스트림 | IntStream.range(1, 5) → 1,2,3,4 |
IntStream.rangeClosed(a, b) | a 부터 b 까지의 숫자 스트림 | IntStream.rangeClosed(1, 5) → 1,2,3,4,5 |
Stream.iterate(seed, UnaryOperator<T>) | 초기값 seed 에서 시작해 규칙적으로 값 생성 | Stream.iterate(1, n -> n + 2).limit(5) → 1,3,5,7,9 |
Stream.generate(Supplier<T>) | 계속해서 새로운 값 생성 | Stream.generate(Math::random).limit(3) |
Files.lines(Path) | 파일의 각 줄을 스트림으로 변환 | Files.lines(Paths.get("test.txt")) |
메서드 | 설명 | 예제 |
---|---|---|
filter(Predicate<T>) | 조건을 만족하는 요소만 필터링 | filter(n -> n > 10) |
map(Function<T, R>) | 요소를 변환(매핑) | map(n -> n * 2) |
flatMap(Function<T, Stream<R>>) | 중첩된 컬렉션을 평탄화 | flatMap(List::stream) |
distinct() | 중복 제거 | distinct() |
sorted() | 오름차순 정렬 | sorted() |
sorted(Comparator<T>) | 사용자 정의 정렬 | sorted(Comparator.reverseOrder()) |
peek(Consumer<T>) | 중간 연산에서 값 확인 (디버깅) | peek(System.out::println) |
limit(long n) | 처음 n 개 요소 선택 | limit(5) |
skip(long n) | 처음 n 개 요소 건너뛰기 | skip(2) |
메서드 | 설명 |
---|---|
collect(Collectors.toList()) | 스트림을 리스트로 변환 |
forEach(System.out::println) | 각 요소 출력 |
count() | 개수 반환 |
anyMatch() , allMatch() | 특정 조건 만족 여부 확인 |
findFirst() , findAny() | 첫 번째 요소 또는 아무 요소 가져오기 |
스트림 API를 사용함으로써 명확하고 간결한 코드를 작성할 수 있다.
List myList = Arrays.asList("apple", "banana", "cherry", "date");
myList.stream()
.filter(s -> s.startsWith("a"))
.forEach(System.out::println);
List<Integer> newRes = res.stream()
.distinct()
.sorted()
.collect(Collectors.toList());
res.stream()
.distinct()
, .sorted()
.collect(Collectors.toList())