스트림 API 개념

스트림 API 개념

스트림 API

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

https://www.slideshare.net/devsejong/8-2-stream-api
https://starplatina.tistory.com/entry/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%8A%B8%EB%A6%BC-API
https://www.slideshare.net/arawnkr/api-42494051




스트림 생성

https://www.slideshare.net/arawnkr/api-42494051

예시 : 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
40
//스트림 API사용 전
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");
}

//출력값
강조지 그레이스호퍼 브라이언


//스트림 API사용 후
List<String> ppl2 = Arrays.asList("하지","강조지","휘슬","그레이스호퍼","브라이언");
Stream<String> stream = ppl2.stream(); //스트림생성
stream.filter(p2 ->{
return p2.length() >= 3;
}).forEach(System.out::println);

//출력값
강조지
그레이스호퍼
브라이언

//스트림 API사용
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+"]");
});

//출력값
[강조지][그레이스호퍼][브라이언]




중간처리

https://www.slideshare.net/arawnkr/api-42494051

https://www.slideshare.net/arawnkr/api-42494051

예시

  • 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("안녕","자바월드");
//return타입인 경우에는 return예약어를 생략.
//리턴타입이 없는 건 생략안됨 `forEach(data -> {System.out.println(data.length);}`
//list.stream().map((item) -> {return item.toCharArray();}).forEach(data -> {System.out.println(data.length);});
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




최종처리

  • 매칭과 집계

https://www.slideshare.net/arawnkr/api-42494051


  • 예시 :
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
42
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 일 때만 호출