List 같은 자료형에서, 특정 조건에 해당하는 항목들을 필터링 한다든지, Map 자료형에서 value 에 해당하는 요소들만 모아서 List로 반환한다든지 하는 등 C#의 Linq 쿼리의 where 조건이나 select 조건 등과 유사한 연산을 하는 API 이다.
다만, Linq 쿼리는 쿼리문과 유사하게 개발자가 작성을 해야 한다면, Java의 Stream API는 체이닝을 통해 이미 기본으로 제공하는 함수들을 호출한다는 점에서 다르다.
1. Stream() 사용법
- List 자료형에서는 변수명.stream() 메소드 호출을 통해 후속 함수들을 호출함으로서 사용한다.
- Map 자료형에서는 entrySet().stream() 메소드 호출을 통해 후속 메소드는 List와 동일한 형식으로 호출함으로서 사용한다.
- 메소드 호출시 인자값으로 주로 람다식을 사용한다.
- 구성
- 중간 연산 메소드와 최종 메소드로 나누어 진다.
- 중간 연산 메소드는 단독으로 쓰일수 없는 filter, map, distinct, sorted 같은 메소드를 말한다. 중간메소드는 체이닝으로 이어서 사용할 수 있다
- 최종 메소드는 중간연산을 토대로 최종적으로 데이터를 가져오는 collect, forEach, first 같은 메소드를 말한다.
- 중간 연산 메소드와 최종 메소드로 나누어 진다.
2. Steam 메소드 예
- filter()
- Where 조건절에 해당하는 메소드로, 조건에 맞는 값을 골라낸다.
- 이 메소드만 사용하여선 안되고, Collection 메소드를 통해 조건에 맞는 항목들을 가져와야 한다.
- 예
...
List<String> testList = new List<String>();
testList.add("Hello");
....
String temp = testList.stream()
.filter(x -> x.equals("Hello"))
. ......
- map()
- select 에 해당하는 메소드로, 원하는 항목을 수집할때 사용한다. 주로 map 에서 value 값만 따로 꺼내오고 싶을때 사용한다.
- 혹은, List<String> 자료형에서 조건에 맞는 String 을 가져오는게 아니라, 해당 length 만 반환 받는다든지 하는, 기존 자료형을 다른 타입이나 값으로 변환 한다.
- 예
...
Map<String, Integer> testMap = new HashMap<String, Integer>();
testMap.put("Hello",10);
....
//map 에서 value 만 뽑아 낼때
testMap.entrySet().stream().map(x -> x.getValue()).Collect(.....)
....
//map 에서 key의 길이만 뽑아낼때. 이때는 key의 String이 아닌 Integer 형태의 값을
//받게 된다.
testMap.entrySet().stream().map(x -> x.getKey().length()).Collect(.....)
- distinct()
- 중복 항목을 제거하는 중간연산 메소드 이다.
- 다른 인자값 없이 이 메소드만 중간연산자로 붙이면 된다.
- sorted()
- 기본적으로 오름차순 정렬이다.
- 인자값으로 Comparator 이라고 하는 정렬을 위한 메소드를 넣어줘야 한다.
...
List<String> testList = new ArrayList<String>();
testList.add("Carrot");
testList.add("Apple");
testList.add("Banana");
...
/*문자열 길이로 정렬을 하고, 알파벳 순서로 정렬을 한다. */
List<String> orderList = testList.stream().sorted(Comparator.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder()).collect(Collectors.toList());
...
커스텀 Comparator 을 이용한 예
...
public class CustomComparator implements Comparator<Person> {
@Override
public int compare(String p1, String p2) {
return Integer.compare(p1.length(), p2.length());
}
}
...
List<String> testList = new ArrayList<String>();
testList.add("Carrot");
testList.add("Apple");
testList.add("Banana");
...
/*문자열 길이로 정렬을 하고, 알파벳 순서로 정렬을 한다. */
List<String> orderList = testList.stream().sorted(new CustomComparator()).collect(Collectors.toList());
...
- collect
- 엄청 자주 사용되는 최종 연산 메소드 이다.
- 메소드 인자값으로 Collectors.toList() 같은 Collectors의 static 메소드를 넣는다.
- toList, toSet 등 Collections 자료형을 변환하는 경우에는, 값의 수정이 되지 않는 toImmutableList 같은 메소드들도 있다.
- Collectors.toList()
- Collectors.toSet()
- Collectors.joining() 등...
- 주로 json 형식으로 변환하는 등의 과정에서 사용되며, 반환되는 데이터 사이사이에 특정 문자열을 추가하는 형태로 쓴다.
- joining(" , ") 을 하게 되면, 각 데이터 + " , " 로 조합하여 리턴하게 된다.
'Java' 카테고리의 다른 글
| Atomic 자료형 (0) | 2025.12.12 |
|---|---|
| Optional.ofNullable 로 null-safe 처리 하기 (0) | 2025.11.04 |
| 파일 쓰고, 읽기 예제 (0) | 2025.10.02 |
| Checked, Unchecked Exception (0) | 2025.10.01 |
| Java Collections Framework (List, Map...) (0) | 2025.09.10 |