본문 바로가기
카테고리 없음

java stream 정리

by 문자메일 2022. 4. 2.

https://futurecreator.github.io/2018/08/26/java-8-streams/

 

Java 스트림 Stream (1) 총정리

이번 포스트에서는 Java 8의 스트림(Stream)을 살펴봅니다. 총 두 개의 포스트로, 기본적인 내용을 총정리하는 이번 포스트와 좀 더 고급 내용을 다루는 다음 포스트로 나뉘어져 있습니다. Java 스트

futurecreator.github.io

 

 

자바 8에서 추가된 Stream은 람다를 활용할 수 있는 기술 중 하나.

 

스트림은 '데이터의 흐름' 이다. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. 

배열과 컬렉션을 함수형으로 처리할 수 있다.

 

스트림의 작업 내용

  1. 스트림 생성 : 컬렉션 타입은 인터페이시스에 추가된 디폴트 메소드 stream을 이용해서 스트림 만들 수 있다.
  2. 데이터 가공 : 필터링, 맵핑 등 원하는 작업 추가하여 수행
  3. 결과 만들기 : 

 

 

  • mapToInt() : IntStream으로 바꿔주는 메서드

 

//        int totalPrice = 0;
//        for(OrderItem orderItem : orderItems){
//            totalPrice = orderItem.getTotalPrice();
//        }
//        return totalPrice;

        // 람다 스트림 사용하면 위 로직을 아래처럼 바꿀 수 있다.
        return orderItems.stream()
                .mapToInt(OrderItem -> OrderItem.getTotalPrice())
                .sum();

 

 

 

  • map() : 스트림 내의 요소들을 하나씩 특정 값으로 변환해준다.
              이 때 값을 변환하기 위한 람다를 입력 받는다.


  • Collectors.toList() : map()에서 작업된 요소들을 가져온 후 리스트로 결과를 가져온다.
//        List<MemberDto> collect = new ArrayList<MemberDto>();
//        for(Member member : findMembers){
//            collect.add(new MemberDto(member.getName()));
//        }

        List<MemberDto> collect = findMembers.stream()
                .map(m -> new MemberDto(m.getName()))
                .collect(Collectors.toList());

위 예시 코드에서 주석처리된 for문과 아래 lambda로 구현된 코드의 동작은 같다. 

 

 

 

//return countMap.values().stream().mapToInt(i->i).toArray();
// 람다식 사용하는 방법
//return countMap.values().stream().mapToInt(i->Integer.valueOf(i)).toArray();
// 1. mapToInt에 메서드 참조를 이용하는 방법
return countMap.values().stream().mapToInt(Integer::intValue).toArray();

 

 

stream으로 ArrayList를 Map으로 바꾸는 코드

아래 DTO 객체에 id 값이 있는데, id 값이 map의 key로 만들어진다.

Map<Long, List<OrderItemQueryDto>> orderItemMap = orderItems.stream()
        .collect(Collectors.groupingBy(orderItemQueryDto -> orderItemQueryDto.getOrderId()));

댓글