💡 핵심 요약 (TL;DR)
스트림 API 개념의 동작 원리를 이해하고 실제 프로젝트에 적용하기 위한 실무 가이드다.
* 최종처리 : 반복, 카운팅, 평균, 총합 등 집계처리 담당, 최종처리는 한 개만 사용한다.
스트림 API
- 스트림 API란 자바 8부터 추가된
java.util.stream패키지
- I/O 스트림과는 전혀 무관하다.
- 목적 : 배열을 포함한 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리가능하도록 만듦
- 장점
- 코드 간결
- 컬렉션과 배열 등 데이터 소스를 공통된 방식으로 접근 가능
- 중간처리와 최종 처리를 조합해서 처리 가능
- 중간처리 : 매핑, 필터링, 정렬 등 데이터 가공 담당
- 최종처리 : 반복, 카운팅, 평균, 총합 등 집계처리 담당, 최종처리는 한 개만 사용한다.
- 병렬처리 작업이 용이
- 연산의 결과를 원본에 반영하지않음 -> 결과를 새로운 컬렉션이나 배열에 담아서 반환가능



스트림 생성

예시 : List에 담긴 요소 중 3글자 이상인 요소를 순차적으로 출력하기 위한 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| List<String> ppl = Arrays.asList("하지","강조지","휘슬","그레이스호퍼","브라이언"); List<String> sub = new ArrayList<>(); for(String p : ppl){ if(p.length() >= 3){ sub.add(p); } }
for (String p : sub){ System.out.print(p+"\t"); }
강조지 그레이스호퍼 브라이언
List<String> ppl2 = Arrays.asList("하지","강조지","휘슬","그레이스호퍼","브라이언"); Stream<String> stream = ppl2.stream(); stream.filter(p2 ->{ return p2.length() >= 3; }).forEach(System.out::println);
강조지 그레이스호퍼 브라이언
String[] ppl3 = {"하지","강조지","휘슬","그레이스호퍼","브라이언"}; Stream<String> fromArray = Arrays.stream(ppl3); List<String> pplList = Arrays.asList(ppl3); Stream<String> fromList = pplList.stream(); fromList.forEach(a-> { if(a.length() >=3) System.out.print("["+a+"]"); });
[강조지][그레이스호퍼][브라이언]
|
중간처리


예시
- map()메서드를 이용해 char[]로 구성된 스트림로 변경 후 각 요소의 length속성값을 출력
- return타입인 경우에는
return 예약어와 대괄호{}를 생략 가능.
.map((item) -> {return item.toCharArray();}) = .map(item-> item.toCharArray())
- return타입인 아니경우 대괄호
{} 생략불가.
- int 스트림을 mapToObj()로 문자열스트림으로 변경한 뒤 각 요소를 출력
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| List<String> list = Arrays.asList("안녕","자바월드");
list.stream().map(item-> item.toCharArray()).forEach(data -> {System.out.println(data.length);}); IntStream is = IntStream.range(3, 5); is.mapToObj(num -> { return "제곱: "+num+num; }).forEach(System.out::println);
2 4 제곱: 33 제곱: 44
|
최종처리




1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public static void main(String[] args) { Locale[] locales = Locale.getAvailableLocales();
Map<String, List<Locale>> langNames2 = Arrays.stream(locales).filter(locale ->{ return locale.getDisplayCountry().trim().length() > 0; }).collect(Collectors.groupingBy(locale -> { return locale.getLanguage(); }));
System.out.print("한국어를 사용하는 locale은? "); langNames2.get("ko").stream().forEach(locale->{ System.out.println("["+locale.getDisplayCountry()+"]"); }); System.out.print("영어를 사용하는 locale은? "); langNames2.get("en").stream().forEach(locale->{ System.out.print("["+locale.getDisplayCountry()+"] "); });
Map<Boolean, List<Locale>> langName3 = Arrays.stream(locales).filter(locale -> { return locale.getDisplayCountry().trim().length() >0; }).collect(Collectors.partitioningBy(locale -> { return locale.getLanguage().equals("ko"); })); System.out.print("\n한국어를 사용하지않는 locale의 수는? "); System.out.println(langName3.get(false).stream().count() + "개");
langName3 = Arrays.stream(locales).filter(locale -> { return locale.getDisplayCountry().trim().length() >0; }).collect(Collectors.partitioningBy(locale -> { return locale.getLanguage().equals("en"); })); System.out.print("\n영어를 사용하지않는 locale의 수는? "); System.out.println(langName3.get(false).stream().count() + "개"); }
한국어를 사용하는 locale은? [대한민국] 영어를 사용하는 locale은? [미국] [싱가포르] [몰타] [필리핀] [뉴질랜드] [남아프리카] [오스트레일리아] [아일랜드] [캐나다] [인도] [영국] 한국어를 사용하지않는 locale의 수는? 113개
영어를 사용하지않는 locale의 수는? 103개
|
orElse와 orElseGet의 차이
- orElse 메소드는 해당 값이 null 이든 아니든 관계없이 항상 호출
- orElseGet 메소드는 해당 값이 null 일 때만 호출
#TILITWILL(JAVA)