Java

자바 스트림

grove1212 2025. 1. 22. 21:18

1. 스트림이란?

  • 배열, 리스트 등 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 기능.
  • Collection 내부의 데이터 정렬, 필터링, 중복 제거 등을 구현 시 필요.

2. 특징

  • 원본 데이터를 변경 하지 않는다.
  • 일회용이다.
  • 람다식으로 요소 처리 코드를 제공
  • 내부 반복자를 사용하므로 병렬 처리가 쉽다.
List<String> names = Arrays.asList("jeong", "pro", "jdk", "java");// 기존의 코딩 방식long count = 0;
for (String name : names) {
if (name.contains("o")) {
    count++;
}}
System.out.println("Count : " + count); // 2

// 스트림 이용한 방식
count = 0;
count = names.stream().filter(x -> x.contains("o")).count();
System.out.println("Count : " + count); // 2

3. 스트림 사용법과 주의사항

스트림의 구조는 다음과 같다.

  • 스트림 생성
  • 중개 연산
  • 최종 연산
  • Collections같은 객체 집합.스트림생성().중개연산().최종연산()

3-1. 중개 연산

1. Filter

List<String> names = Arrays.asList("jeong", "pro", "jdk", "java"); 
Stream<String> a = names.stream().filter(x -> x.contains("o");

2. Map
스트림의 각 요소를 연산하는데 쓰인다.

List<String> names = Arrays.asList("jeong", "pro", "jdk", "java"); 
names.parallelStream() .map(x -> x.concat("s")) .forEach(x -> System.out.println(x)); 
//jeongs, pros, jdks, javas

3. Peek
Map과 유사하게 각 요소에 어떤 연산을 적용할 때 쓰인다.

4. Sorted
스트림의 요소들을 정렬해준다.

5. Limit
스트림의 개수를 제한한다.(중개연산이기 때문에 스트림 반환)

List<Integer> ages = Arrays.asList(1,2,3,4,5,6,7,8,9); 
ages.stream() .filter(x -> x > 3) .limit(3); 
//4, 5, 6

6. Distinct
distinct() 시 중복 제거

7. Skip
skip(2) 하면 초반 2개 요소는 스킵하고 남은 요소들로 새 stream을 만든다.

mapToInt, mapToLong, mapToDouble
각각의 데이터형을 가진 스트림으로 바꿔준다.

3-2. 최종 연산

  1. count(), min(), max(), sum() ...
  2. reduce
    누적된 값을 계산하는 함수이다.
List<Integer> ages = new ArrayList<Integer>();
ages.add(1);ages.add(2);ages.add(3);//1,2,3
System.out.println(ages.stream().reduce((b,c) -> b+c).get());//1+2+3=6
  1. forEach
    각 요소를 돌면서 처리할 수 있다.
List<Integer> ages = new ArrayList<Integer();
ages.add(1);ages.add(2);ages.add(3);//1,2,3
Set<Integer> set = ages.stream().collect(Collectors.toSet());
set.forEach(x-> System.out.println(x));//1,2,3
  1. collect
    스트림의 값들을 모아주는 기능을 한다. toMap, toSet, toList를 통해 스트림을 컬렉션으로 변환시켜준다.
  2. iterator
    Iterator를 반환한다.
List<Integer> ages = new ArrayList<Integer();
ages.add(1);ages.add(2);ages.add(3);//1,2,3
Iterator<Integer> it = ages.stream().iterator();
while(it.hasNext()){
    System.out.println(it.next());
}
  1. noneMatch, anyMatch, allMatch
    • noneMatch : 모든 요소들이 조건을 만족하지 않으면 True
    • anyMatch : 요소들 중 하나라도 조건을 만족하면 True
    • allMatch : 모든 요소들이 조건을 만족하면 True

* 참고자료

https://jeong-pro.tistory.com/165

https://dev0101.tistory.com/36

'Java' 카테고리의 다른 글

[Java] List를 배열로, 배열을 List로 변환하기  (0) 2025.01.23
Java에서 Array 객체 복사하는 방법  (1) 2025.01.23
자바 스트림 예제 3  (0) 2025.01.23
자바 스트림 - 예제 2  (0) 2025.01.22
자바 스트림 - 예제 1  (0) 2025.01.22