TIL

[TIL] Stream API method 탐구, map과 filter

봄봄로그 2023. 10. 24. 19:32

일할 때 자주 쓰긴 하는데 사실 확실히 아는상태에서 쓰는게 아니라 얼레벌레 쓰는 것 같아서..

stream 연습문제를 풀기 전에 여러 케이스를 짜보면서 공부해봤다..

 

실험대상은 맵으로 만들어진 리스트와 스트링 리스트 두개,,

        Map<String,String> map = Map.of("두산","김현수","키움","이지영","샌디애고","김하성");
        Map<String,String> map2 = Map.of("키움","승리를 위한 함~성","두산","걸어간다 양의지","기아","기아의 김~주찬");
        List<Map<String,String>> mapList = List.of(map,map2);
        List<String> stringList = List.of("Kiwoom","Hanhwa","Doosan", "heroes");

 

  map : 기존의 stream 요소들을 변환하여 새로운 stream을 생성한다.

// 1        
        List<String> collect = mapList.stream() // stream을 생성
                .map(test -> test.get("두산"))
                .collect(Collectors.toList());
        System.out.println("collect = " + collect); // collect = [김현수, 걸어간다 양의지]

key 값이 "두산"인 value 두개를 찾아서 리스트로 만들어준다. 김현수와 볼넷으로 걸어나가는 양의지가 선정되었다.

 

 

        List<String> strings = stringList.stream()
                .map(test -> test.toUpperCase())
                .collect(Collectors.toList());
        System.out.println("strings = " + strings); // strings = [KIWOOM, HANHWA, DOOSAN, HEROES]

string list에서 map method를 사용할 때는 이렇게 요소들을 변환시킬 수 있다.

 

 

String으로 구성된 List를 쪼개주면 List<String[]> 형태의 값이 나온다.

        List<String[]> collect = stringList.stream()
                .map(s -> s.split(""))
                .collect(Collectors.toList());

[Kiwoom,Hanhwa,Doosan, heroes] -> {[K,i,w,o,o,m], [H,a,...], [...], [...]}

 

 


filter : 조건에 맞는 데이터로 컬렉션 구성, boolean 반환하는 람다식 작성한다.

        List<String> strings1 = stringList.stream()
                .filter(s -> s.contains("a"))
                .collect(Collectors.toList());
        System.out.println("strings1 = " + strings1); //strings1 = [Hanhwa, Doosan]

stringList에 'a'가 포함된 요소들이 출력된다.

 

        List<Map<String, String>> collect1 = mapList.stream()
                .filter(test -> test.get("두산").equals("김현수"))
                .collect(Collectors.toList());
        System.out.println("collect1 = " + collect1); //collect1 = [{샌디애고=김하성, 키움=이지영, 두산=김현수}]

filter는 요소를 변환시키는 것이 아니라 필터링만 해주는 것이기 때문에 형태가 List<Map<String, String>> 으로 나온다.!!!!!!!!!! 그래서 두산에 김현수가 있는 map이 출력된다.

 

        List<String> collect2 = mapList.stream()
                .filter(test -> test.get("두산").equals("김현수"))
                .map(s-> s.get("두산"))
                .collect(Collectors.toList());
        System.out.println("collect2 = " + collect2); //collect2 = [김현수]

위의 상태에서 map을 사용하여 key가 "두산" 인 것만 추리면 이때 나오는 형태는 List<String> 형태가 되고 김현수가 출력된다. 1번코드에서 필터없이 사용했을 땐 김현수와 걸어가는 양의지가 출력됐지만 이제는 김현수만 나오는 것이다.

 

 

 

 

 

* 참고 : https://mangkyu.tistory.com/114