Stream, 이제 결과를 만들 일만 남았습니다!

지인호·2021년 6월 14일
2

자바 Stream

목록 보기
4/4
post-thumbnail

List<String> list = Stream.of("이제", "결과를", "만들", "일만", "남았습니다").howToConvertList?

🤔지금까지 우리는 무엇을 하였나요?

일주일이 넘는 오랜시간, 우리는 Stream 이 왜 필요한지부터 어떻게 만들고, 어떻게 사용하는지, 그 모든 방법들을 섭렵해왔습니다! Stream.of 처럼 비교적 사용하기 쉬운 기술이 있기 반면, iterator 같이 수준높은 기술이 있기도 하였고, EmptyStream 처럼, 기존 자바의 문제를 해결한 기술 또한 있었습니다.
저희는 여러 방법으로 스트림을 생성하고 가공해왔습니다.
이제 결과를 만들일만 남았습니다

지금바로, Stream 총정리 강의 4강이자 마지막강, Stream으로 결과를 만드는방법을 보러 갑시다!

💡잠깐! 지금부터 나올 코드들은 다음 코드를 내장하고 있습니다.

	List<String> list = Arrays.asList("USA", "Korea", "Japan", "China");

Collectors, Stream 의 결과를 모아주는 기술

Stream 클래스에는 Collectors 를 인자로 받는 collect 라는 객체가 있습니다. 바로 Stream 의 여러 요소들을 한데 모아, 하나의 결과(result) 로 만들어주는 객체인데요. toList 부터 joining 이라는 메서드까지, 다양한 메서드들로 결과를 생성하는 Collector 를 반환하는 메서드입니다.
한번, 다양한 Collectors 의 메서드에 대해 알아봅시다!

Stream 을 List로, Collectors.toList()

List<String> toList = list.stream().collect(Collectors.toList());
//toList : "USA", "Korea", "Japan", "China"

Collector.stream 메서드로, collector 를 stream 으로 만들었듯이, Collectors.toList 메서드를 사용하면 stream 을 collector 로 바꿀 수 있습니다!

Stream 계의 toString, Collectors.joining()

String toString = list.stream().collect(Collectors.joining());
String toStringWithArgs = list.stream()
	.collect(Collectors.joining(" and ", "(", ")"));
//toString = "USAKoreaJapanChina"
//toStringWithArgs = "(USA) and (Korea) and (Japan) and (China)"

Collectors.joining 메서드는 요소를 전부 하나의 String 으로 이어줍니다.
단, 메서드의 인자로 다음 3개의 값을 넣을경우, 중간 구분자와 접두사, 접미사를 구현할 수 있습니다
Collectors.joining(delimiter, prefix, suffix)

  • delimiter : 각 요소 중간에 들어가 요소를 구분시켜주는 중간 구분자 입니다!
  • prefix : 요소마다 맨 앞에 붙는 접두사 입니다!
  • suffix : 요소마다 맨 뒤에 붙는 접미사 입니다!

Stream 으로 평균을 구하고 싶다면? Collectors.averageingInt()

Double avg = list.stream().collect(Collectors.averagingInt(String::length));
//avg : 4.5

averageingInt 메서드는 람다를 받아, 요소를 하나씩 람다의 인자로 넣고, 이에대한 리턴값의 평균을 구하여 반환합니다!

Stream 으로 총합 구하고 싶다면? Collectors.summingInt()

Double sum = list.stream().collect(Collectors.summingInt(String::length));
//avg : 18

summingInt 메서드는 람다를 받아, 요소를 하나씩 람다의 인자로 넣고, 이에대한 리턴값의 총합을 구하여 반환합니다!

제약조건으로 요소들을 분류해보자! Collectors.groupingBy()

Map<Integer, List<String>> groupingMapOfList = list.stream()
	.collect(Collectors.groupingBy(String::length));
//groupMapOfList : {key : 3, value : {"USA"}}, {key : 5, value : {"Korea", "Japan", "China"}}

groupingBy 메서드는 람다를 받아, 요소를 하나씩 람다의 인자로 넣고, 이에 대한 리턴값을 키로하는 Map<Key, List<T>> 형태의 맵을 생성합니다! 만약 리턴값이 같을경우 즉, 키가 같을경우, List 내의 요소로 추가됩니다.

머리아픈 If문, 이젠 그만! Matching

boolean anyMatch = list.stream().anyMatch(country -> country.length == 3);
boolean allMatch = list.stream().allMatch(country -> true);
boolean noneMatch = list.stream().noneMatch(country -> false);

//anyMatch && allMatch && noneMatch : true

Stream 은 Matching 이라는 기술을 통해, Stream 내의 요소를 조건식을 통해 체크하는데요. Matching 기술에 대한 각 메서드들은 Predicate<T> 형식의 조건문을 받아, 몇개의 요소가 조건식에서 true 를 반환하는지에 따라 다른 반환값을 제공합니다!

  • anyMatch : 하나라도 조건식에서 true 를 반환할경우 true
  • allMatch : 모든 요소가 조건식에서 true 를 반환할경우 true
  • noneMatch : 모든 요소가 조건식에서 false 를 반환할경우 true
    이 이외의 모든 경우에서는 false 를 반환합니다!

Iterating이라 쓰고, for each 라 읽는다!

list.stream().forEash(System.out::print);
console : USAKoreaJapanChina

forEach 메서드는 요소들을 하나씩 불러와 실행되는 최종 작업입니다! 이전, Stream 의 가공에서 iterator 와 비교하며 다룬내용이지만, 스트림의 결과를 만드는 기술이기도 합니다.

지금까지 우리는 무었을 배웠나요?

방금, Stream 에 대한 제가 준비한 여행길이 끝났습니다!
여러분은 지금까지, 스트림이 왜 쓰이고 어떻게 쓰이는지 스트림에 대한 여러 지식 들을 배워왔습니다!
여러분은 제가 준비한 로드맵은 여기까지입니다!

지식을 보는것은 누구나 할 수 있으나.
지식을 아는것은 생각하는 자만이 하고,
지식을 이해하는것은 지혜로운자만이 할 수 있다

지금까지 Xylope 의 스트림 기초강의 였습니다! 감사합니다!!!

profile
테오의 스프린트 17기 퍼실리테이터

0개의 댓글