[ Java ] Stream(스트림) 개념 정리

chorok ☘️·2025년 6월 17일
0

Java 개념

목록 보기
1/7
post-thumbnail

Stream은 java 8부터 추가된 기능으로 컬렉션에 저장된 데이터를 함수형 스타일로 처리할 수 있게 해준다.

📚 Collection

여러 가지 자료구조(List, Map, Set)를 제공하며 각각의 특성과 사용법을 이해하고 성능과 사용 목적에 맞게 사용하는 것이 중요하다
(ex. 데이터의 삽입과 삭제가 빈번한 경우 LinkedList를 사용하는 것이 좋고, 검색이 주로 이루어지는 경우에는 ArrayList나 HashMap을 사용하는 것이 효율적이다.)

List

순서가 있는 데이터의 집합으로, 데이터의 중복을 허용한다.
ArrayList와 LinkedList가 대표적.
ArrayList는 내부적으로 배열을 사용하여 데이터를 관리
LinkedList는 노드의 연결을 통해 데이터를 관리

Set

순서를 유지하지 않으며, 데이터의 중복을 허용하지 않는다.
HashSet과 TreeSet이 대표적.
HashSet은 해싱을 이용해 데이터를 관리
TreeSet은 트리 구조를 이용해 데이터를 관리

Map

키와 값의 쌍으로 데이터를 저장하는 구조. 키의 중복을 허용하지 않으며 각 키는 하나의 값을 가리킨다.
HashMap과 TreeMap이 대표적
HashMap은 해싱을 이요해 데이터를 관리
TreeMap은 트리 구조를 이요해 데이터를 관리

🌊 Stream

데이터를 필터링, 변환, 집계, 등의 연산을 간결하고 효율적으로 수행할 수 있다. 가장 큰 장점은 코드의 가독성과 유지보수성을 높일 수 있다.

특징: 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"))
  • 중간 연산 메서드(Intermediate Operations)
메서드설명예제
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)
  • 최종 연산(Terminal Operations)
메서드설명
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);
  • myList 컬렉션에서 “a”로 시작하는 요소만 필터링하여 출력한다.
List<Integer> newRes = res.stream()
						  .distinct()
						  .sorted()
	   					  .collect(Collectors.toList());
  1. res.stream()
    • res 리스트를 Stream으로 변환한다.
    • 실행하면, List에서 Stream로 변환이 이루어진다.
  2. .distinct(), .sorted()
    • 중복 제거, 오름차순 정렬
  3. .collect(Collectors.toList())
    • Stream을 다시 리스트로 변환한다
    • 실행하면 List ****형태로 변환하는 역할을 한다.


참고 자료: 코딩테스트 합격자 되기 : 자바편
profile
백엔드 개발자 chorok's velog

0개의 댓글