티스토리 뷰

Backend/Java8

#29 Advanced Stream - To Map

RadderNepa 2022. 10. 18. 00:42

● 도입

public static <T, K, U> Collector<T, ?, Map<K,U>> toMap (
                                          Function<? super T, ? extends K> keyMapper,
                                          Function<? super T, ? extends U> valueMapper)

- Stream 안의 데이터를 map의 형태로 반환해주는 collector
- keyMapper : 데이터를 map의 key로 변환하는 Function
- valueMapper : 데이터를 map의 value로 변환하는 Function
- 'Map<K,U>'가 최종적으로 반환될 Map의 형태이다.(key의 type이 'K', value의 type이 'U')

 

출처 - The Red: 25개 백엔드 개발 필수 현업 예제를 통해 마스터하는 JAVA STREAM(fastcampus)

 

- k(...)가 keyMapper Function / v(...)가 valueMapper Function 이다.

- 위 그림과 같은 식으로 Stream의 데이터가 Map의 형태로 반환된다.

 

 

● 실습

1.

package com.fastcampus.functionalprogramming.chapter8;

import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Chapter8Section6 {
	public static void main(String[] args) {
		// Stream.of(3, 5, -4, 2, 6)
		// 위 Stream의 각 Integer를 key로, "Number is ..."을 value로 갖는 Map을 만들어보자
		Map<Integer, String> numberMap = Stream.of(3, 5, -4, 2, 6).collect(Collectors.toMap(x -> x, x -> "Number is " + x));
		System.out.println(numberMap);
		System.out.println("numberMap1 : " + numberMap.get(3));
		System.out.println("numberMap1 : " + numberMap.get(5));
		
		Map<Integer, String> numberMap2 = Stream.of(3, 5, -4, 2, 6).collect(Collectors.toMap(Function.identity(), x -> "Number is " + x));
		// (x -> x)와 같이 단순한 함수의 경우 Function.identity()를 대신 사용해도 된다.
		// identity : Returns a function that always returns its input argument.
		System.out.println(numberMap2);
		System.out.println("numberMap2 : " + numberMap.get(-4));
		System.out.println("numberMap2 : " + numberMap.get(2));
	}
}

 

2. 각 user들의 object가 담겨있는 List를 이용해 (id, user obejct) 형식의 Map을 만들어보자

package com.fastcampus.functionalprogramming.chapter8;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.fastcampus.functionalprogramming.chapter8.model.User;

public class Chapter8Section6 {
	public static void main(String[] args) {
		User user1 = new User()
				.setId(101)
				.setName("Alice")
				.setVerified(true)
				.setEmailAddress("alice@fastcampus.co.kr");
	    User user2 = new User()
	    		.setId(102)
	    		.setName("Bob")
	    		.setVerified(false)
	    		.setEmailAddress("bob@fastcampus.co.kr");
	    User user3 = new User()
	    		.setId(103)
	    		.setName("Charlie")
	    		.setVerified(false)
	    		.setEmailAddress("charlie@fastcampus.co.kr");
	    
	    List<User> users = Arrays.asList(user1, user2, user3);
	    
	    // 각 user들의 object가 담겨있는 List를 이용해 (id, user obejct) 형식의 Map을 만들어보자
	    Map<Integer, User> userIdToUserMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));
	    
	    System.out.println(userIdToUserMap);
	    System.out.println(userIdToUserMap.get(101));
	    System.out.println(userIdToUserMap.get(102));
	    System.out.println(userIdToUserMap.get(103));
	}
}

 

3. (id, OrderStatus) 형식의 Map을 만들어보자

package com.fastcampus.functionalprogramming.chapter8;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.fastcampus.functionalprogramming.chapter8.model.Order;
import com.fastcampus.functionalprogramming.chapter8.model.Order.OrderStatus;
import com.fastcampus.functionalprogramming.chapter8.model.User;

public class Chapter8Section6 {
	public static void main(String[] args) {
	    // 숙제
	    Order order1 = new Order()
	    		.setId(1001L)
	    		.setAmount(BigDecimal.valueOf(2000))
	    		.setStatus(OrderStatus.CREATED);
        Order order2 = new Order()
        		.setId(1002L)
        		.setAmount(BigDecimal.valueOf(4000))
        		.setStatus(OrderStatus.ERROR);
        Order order3 = new Order()
        		.setId(1003L)
        		.setAmount(BigDecimal.valueOf(3000))
        		.setStatus(OrderStatus.ERROR);
        Order order4 = new Order()
        		.setId(1004L)
        		.setAmount(BigDecimal.valueOf(7000))
        		.setStatus(OrderStatus.PROCESSED);
        
        List<Order> orders = Arrays.asList(order1, order2, order3, order4);
        
        // TODO : (id, OrderStatus) 형식의 Map을 만들어보자
        Map<Long, OrderStatus> idOrderStatusMap = orders.stream().collect(Collectors.toMap(Order::getId, Order::getStatus));
        System.out.println(idOrderStatusMap);
        System.out.println(idOrderStatusMap.get(1001L));
        System.out.println(idOrderStatusMap.get(1002L));
        System.out.println(idOrderStatusMap.get(1003L));
        System.out.println(idOrderStatusMap.get(1004L));
	}
}

'Backend > Java8' 카테고리의 다른 글

#31 Advanced Stream - Partitioning By  (0) 2022.10.20
#30 Advanced Stream - Grouping By  (1) 2022.10.19
#28 Advanced Stream - Collectors  (0) 2022.10.17
#27 Advanced Stream - Reduce  (0) 2022.10.16
#26 Advanced Stream - Find First / Find Any  (1) 2022.10.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함