JAVA/Stream

[Java] Stream > map

앵낄낄 2023. 6. 8. 19:31
반응형

git

https://github.com/ymwoo88/stream/tree/feature/map-%EC%98%88%EC%A0%9C

설명

Stream의 map API는 stream 흐름에 있는 데이터들을 가공한 결과물을 반환해주는 기능을 제공합니다.

map

주어진 함수를 이 스트림의 요소에 적용한 결과로 구성된 스트림을 반환합니다.
이것은 중간 작업입니다.
매개변수:
매퍼 – 각 요소에 적용할 비간섭, 상태 비저장 함수
보고:
새로운 스트림
<R> Stream<R> map(Function<? super T, ? extends R> mapper);

예제

  • 샘플 데이터 User
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private Long id;
    private String name;
    private String email;
    private Integer age;
    private Boolean isWorking;


    public static User getUserAmil() {
        return User.builder()
                .id(1L)
                .name("amil")
                .email("amil@ymwoo.com")
                .age(28)
                .isWorking(true)
                .build();
    }

    public static User getUserBenny() {
        return User.builder()
                .id(2L)
                .name("benny")
                .email("benny@ymwoo.com")
                .age(26)
                .isWorking(true)
                .build();
    }

    public static User getUserCho() {
        return User.builder()
                .id(3L)
                .name("cho")
                .email("cho@ymwoo.com")
                .age(33)
                .isWorking(false)
                .build();
    }

    public static List<User> getExamUserList() {
        return Arrays.asList(getUserAmil(), getUserCho(), getUserBenny());
    }
  • 샘플 데이터 SendMail
@Getter
@Builder(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@ToString
public class SendMail {

    private String sender;
    private String to;

    public static SendMail valueOf(final String sender,
                                   final String to) {
        return SendMail.builder()
                .sender(sender)
                .to(to)
                .build();
    }
}
  • 예졔1) User 객체에서 > 변수목록 뽑기
    • map을 열고 return 이 명확한 단일형태의 로직은 {}을 생략할 수 있다.
    • List 를 Stream흐름에서 getEmail() 추출하여 List형태로 추출한 테스트이다.
@Test
@DisplayName("email List<String> 목록으로 추출")
void case1() {
    List<User> examUserList = User.getExamUserList();

    List<String> emailList = examUserList
            .stream()
            .map(User::getEmail) // getter user.getEmail()
            .toList();

    // 결과 출력
    emailList
            .forEach(user -> log.info(">>> emailList Info = {}", user));
}
16:40:08.064 [Test worker] INFO com.ymwoo.stream.filter.StreamSortTest -- >>> sortedUser User Info = User(id=2, name=benny, email=benny@ymwoo.com, age=26, isWorking=true)
16:40:08.073 [Test worker] INFO com.ymwoo.stream.filter.StreamSortTest -- >>> sortedUser User Info = User(id=1, name=amil, email=amil@ymwoo.com, age=28, isWorking=true)
16:40:08.073 [Test worker] INFO com.ymwoo.stream.filter.StreamSortTest -- >>> sortedUser User Info = User(id=3, name=cho, email=cho@ymwoo.com, age=33, isWorking=false)
  • 예제2) 다른 Object 타입으로 가공하여 반환 된 목록 뽑기
    • map을 열고 {} 형태를 사용하면 안에서 추가 로직기입이 가능
    • 반환 시 return 을 선언
    • List 데이터 값이 List 형태로 가공되어 리턴 된 테스트이다.
@Test
@DisplayName("다른 모델형태로 List<SendMail> 목록으로 추출")
void case2() {
    List<User> examUserList = User.getExamUserList();

    List<SendMail> sendEmailList = examUserList.stream()
            .map(user -> {
                log.info("email to address info : {}", user.getEmail());
                return SendMail.valueOf("sender@ymwoo.com", user.getEmail());
            })
            .toList();

    // 결과 출력
    sendEmailList
            .forEach(user -> log.info(">>> sendEmailList Info = {}", user));
}
19:26:15.339 [Test worker] INFO com.ymwoo.stream.map.StreamMapTest -- >>> sendEmailList Info = SendMail(sender=sender@ymwoo.com, to=amil@ymwoo.com)
19:26:15.342 [Test worker] INFO com.ymwoo.stream.map.StreamMapTest -- >>> sendEmailList Info = SendMail(sender=sender@ymwoo.com, to=cho@ymwoo.com)
19:26:15.342 [Test worker] INFO com.ymwoo.stream.map.StreamMapTest -- >>> sendEmailList Info = SendMail(sender=sender@ymwoo.com, to=benny@ymwoo.com)

참조

https://backtony.github.io/java/2022-02-06-java-46/

반응형