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. Distinctdistinct()
시 중복 제거
7. Skipskip(2)
하면 초반 2개 요소는 스킵하고 남은 요소들로 새 stream을 만든다.
mapToInt, mapToLong, mapToDouble
각각의 데이터형을 가진 스트림으로 바꿔준다.
3-2. 최종 연산
- count(), min(), max(), sum() ...
- 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
- 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
- collect
스트림의 값들을 모아주는 기능을 한다. toMap, toSet, toList를 통해 스트림을 컬렉션으로 변환시켜준다. - 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());
}
- noneMatch, anyMatch, allMatch
- noneMatch : 모든 요소들이 조건을 만족하지 않으면 True
- anyMatch : 요소들 중 하나라도 조건을 만족하면 True
- allMatch : 모든 요소들이 조건을 만족하면 True
* 참고자료
'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 |