티스토리 뷰
● 도입
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')
- 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
링크
TAG
- 빅데이터
- MySQL
- Advanced Stream
- Java8
- Spring Boot
- node.js
- db
- java
- 알고리즘
- 빅데이터 분석기사
- nosql
- Phaser3
- 코테
- 프로그래머스
- Stream
- Phaser
- SQL
- SpringBoot
- 코딩테스트
- API
- DART
- 자료구조
- jpa
- 운영체제
- 프로세스
- git
- MongoDB
- spring
- OS
- 메모리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함