https://futurecreator.github.io/2018/08/26/java-8-streams/
Java 스트림 Stream (1) 총정리
이번 포스트에서는 Java 8의 스트림(Stream)을 살펴봅니다. 총 두 개의 포스트로, 기본적인 내용을 총정리하는 이번 포스트와 좀 더 고급 내용을 다루는 다음 포스트로 나뉘어져 있습니다. Java 스트
futurecreator.github.io
자바 8에서 추가된 Stream은 람다를 활용할 수 있는 기술 중 하나.
스트림은 '데이터의 흐름' 이다. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다.
배열과 컬렉션을 함수형으로 처리할 수 있다.
스트림의 작업 내용
- 스트림 생성 : 컬렉션 타입은 인터페이시스에 추가된 디폴트 메소드 stream을 이용해서 스트림 만들 수 있다.
- 데이터 가공 : 필터링, 맵핑 등 원하는 작업 추가하여 수행
- 결과 만들기 :
- 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()));
댓글