티스토리 뷰

Backend/Java8

#18 Stream - Stream의 구성 요소

RadderNepa 2022. 10. 7. 02:27

● 도입

- Stream은 3부분으로 구성되어 있다. 아래 사진은 Stream 파이프 라인이다.

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

- 소스         : Stream의 시작, 컬렉션이나 배열 등을 통해 Stream을 만든다.
- 중간 처리 : 원하는 만큼 method를 계속 이어 붙일 수 있다.
- 종결 처리 : 나중에

 

 

● 실습

1. 유저리스트에서 검증되지 않은 유저의 이메일만 뽑아내자

- 총 2단계이다.

①. 검증되지 않은 유저의

②. 이메일만 뽑아내자

package com.fastcampus.functionalprogramming.chapter6.model;

import java.util.List;

public class User {
	private int id;
	private String name;
	private String emailAddress;
	private boolean isVerified;
	private List<Integer> friendUserIds;
	
	public int getId() {
		return id;
	}
	
	public User setId(int id) {
		this.id = id;
		return this;
	}
	
	public String getName() {
		return name;
	}
	
	public User setName(String name) {
		this.name = name;
		return this;
	}
	
	public String getEmailAddress() {
		return emailAddress;
	}
	
	public User setEmailAddress(String emailAddress) {
		this.emailAddress = emailAddress;
		return this;
	}
	
	public boolean isVerified() {
		return isVerified;
	}
	
	public User setVerified(boolean isVerified) {
		this.isVerified = isVerified;
		return this;
	}
	
	public List<Integer> getFriendUserIds() {
		return friendUserIds;
	}
	
	public User setFriendUserIds(List<Integer> friendUserIds) {
		this.friendUserIds = friendUserIds;
		return this;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", " + (name != null ? "name=" + name + ", " : "")
				+ (emailAddress != null ? "emailAddress=" + emailAddress + ", " : "") + "isVerified=" + isVerified
				+ ", " + (friendUserIds != null ? "friendUserIds=" + friendUserIds : "") + "]";
	}
}
package com.fastcampus.functionalprogramming.chapter6;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

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

public class Chapter6Section4 {
	public static void main(String[] args) {
		// 1. 유저리스트에서 검증되지 않은 유저의 이메일만 뽑아내자
		User user1 = new User();
		user1.setId(101);
		user1.setName("Alice");
		user1.setVerified(true);
		user1.setEmailAddress("Alice@garden.com");
		
		User user2 = new User();
		user2.setId(102);
		user2.setName("Bob");
		user2.setVerified(false);
		user2.setEmailAddress("Bob@garden.com");
		
		User user3 = new User();
		user3.setId(103);
		user3.setName("Charlie");
		user3.setVerified(false);
		user3.setEmailAddress("Charlie@garden.com");
		
		List<User> users = Arrays.asList(user1, user2, user3);
		
		// 기존에 하던 방식
		List<String> emails = new ArrayList<String>();
		for (User user : users) {
			if(!user.isVerified()) {
				emails.add(user.getEmailAddress());
			}
		}
		System.out.println(emails);
		
		// 함수형 프로그래밍 방식
		List<String> emails2 = users.stream()
							.filter(user -> !user.isVerified())
							.map(User::getEmailAddress)
							.collect(Collectors.toList());
		System.out.println(emails2);
	}
}

 

2-1. ERROR 상태인 order만 골라내서 해당 order의 createdByUserId만 추출해 List로 생성

- 총 2단계이다.

①. ERROR 상태인 order만 골라내서

②. 해당 order의 createdByUserId만 추출

package com.fastcampus.functionalprogramming.chapter6.model;

import java.util.List;

public class User {
	private int id;
	private String name;
	private String emailAddress;
	private boolean isVerified;
	private List<Integer> friendUserIds;
	
	public int getId() {
		return id;
	}
	
	public User setId(int id) {
		this.id = id;
		return this;
	}
	
	public String getName() {
		return name;
	}
	
	public User setName(String name) {
		this.name = name;
		return this;
	}
	
	public String getEmailAddress() {
		return emailAddress;
	}
	
	public User setEmailAddress(String emailAddress) {
		this.emailAddress = emailAddress;
		return this;
	}
	
	public boolean isVerified() {
		return isVerified;
	}
	
	public User setVerified(boolean isVerified) {
		this.isVerified = isVerified;
		return this;
	}
	
	public List<Integer> getFriendUserIds() {
		return friendUserIds;
	}
	
	public User setFriendUserIds(List<Integer> friendUserIds) {
		this.friendUserIds = friendUserIds;
		return this;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", " + (name != null ? "name=" + name + ", " : "")
				+ (emailAddress != null ? "emailAddress=" + emailAddress + ", " : "") + "isVerified=" + isVerified
				+ ", " + (friendUserIds != null ? "friendUserIds=" + friendUserIds : "") + "]";
	}
}
package com.fastcampus.functionalprogramming.chapter6;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

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

public class Chapter6Section4 {
	public static void main(String[] args) {
		// 대한민국 시간 설정
		LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Seoul"));
		
		Order order1 = new Order();
		order1.setId(1001);
		order1.setStatus(OrderStatus.CREATED);	   // enum 사용
		order1.setCreatedByUserId(101);
		order1.setCreatedAt(now.minusHours(4));	   // 4시간 전에 order 생성
		
		Order order2 = new Order();
		order2.setId(1002);
		order2.setStatus(OrderStatus.ERROR);	   // enum 사용
		order2.setCreatedByUserId(103);
		order2.setCreatedAt(now.minusHours(1));	   // 1시간 전에 order 생성
		
		Order order3 = new Order();
		order3.setId(1003);
		order3.setStatus(OrderStatus.PROCESSED);   // enum 사용
		order3.setCreatedByUserId(102);
		order3.setCreatedAt(now.minusHours(36));   // 36시간 전에 order 생성
		
		Order order4 = new Order();
		order4.setId(1004);
		order4.setStatus(OrderStatus.ERROR);	   // enum 사용
		order4.setCreatedByUserId(104);
		order4.setCreatedAt(now.minusHours(15));   // 15시간 전에 order 생성
		
		Order order5 = new Order();
		order5.setId(1005);
		order5.setStatus(OrderStatus.IN_PROGRESS); // enum 사용
		order5.setCreatedByUserId(101);
		order5.setCreatedAt(now.minusHours(10));   // 10시간 전에 order 생성
		
		List<Order> orders = Arrays.asList(order1, order2, order3, order4, order5);
		
		// 2-1. ERROR 상태인 order만 골라내서 해당 order의 createdByUserId만 추출해 List로 생성
		List<Long> userIds = orders.stream()
							.filter(order -> order.getStatus() == OrderStatus.ERROR)
							.map(Order::getCreatedByUserId)
							.collect(Collectors.toList());
		System.out.println(userIds);
	}
}

 

2-2. ERROR 상태인 order & 주문 생성 시간이 현 시간 기준 24시간 이내인 order만 추출해 List로 생성

- 총 2단계이다.

①. ERROR 상태인 order

②. 주문 생성 시간이 현 시간 기준 24시간 이내인 order만 추출

package com.fastcampus.functionalprogramming.chapter6;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

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

public class Chapter6Section4 {
	public static void main(String[] args) {
		// 대한민국 시간 설정
		LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Seoul"));
		
		Order order1 = new Order();
		order1.setId(1001);
		order1.setStatus(OrderStatus.ERROR);	   // enum 사용
		order1.setCreatedByUserId(101);
		order1.setCreatedAt(now.minusHours(4));	   // 4시간 전에 order 생성
		
		Order order2 = new Order();
		order2.setId(1002);
		order2.setStatus(OrderStatus.ERROR);	   // enum 사용
		order2.setCreatedByUserId(103);
		order2.setCreatedAt(now.minusHours(1));	   // 1시간 전에 order 생성
		
		Order order3 = new Order();
		order3.setId(1003);
		order3.setStatus(OrderStatus.ERROR);   // enum 사용
		order3.setCreatedByUserId(102);
		order3.setCreatedAt(now.minusHours(36));   // 36시간 전에 order 생성
		
		Order order4 = new Order();
		order4.setId(1004);
		order4.setStatus(OrderStatus.ERROR);	   // enum 사용
		order4.setCreatedByUserId(104);
		order4.setCreatedAt(now.minusHours(15));   // 15시간 전에 order 생성
		
		Order order5 = new Order();
		order5.setId(1005);
		order5.setStatus(OrderStatus.ERROR); // enum 사용
		order5.setCreatedByUserId(101);
		order5.setCreatedAt(now.minusHours(10));   // 10시간 전에 order 생성
		
		List<Order> orders = Arrays.asList(order1, order2, order3, order4, order5);
		
		// 2-2. ERROR 상태인 order & 주문 생성 시간이 현 시간 기준 24시간 이내인 order만 추출해 List로 생성
		List<Order> userIds2 = orders.stream()
							.filter(order -> order.getStatus() == OrderStatus.ERROR)
							.filter(order -> order.getCreatedAt().isAfter(now.minusHours(24)))
							.collect(Collectors.toList());
		System.out.println(userIds2);
	}
}

결과값

[
Order [id=1001, createdAt=2022-09-27T19:18:34.410022, createdByUserId=101, status=ERROR, ],
Order [id=1002, createdAt=2022-09-27T22:18:34.410022, createdByUserId=103, status=ERROR, ],
Order [id=1004, createdAt=2022-09-27T08:18:34.410022, createdByUserId=104, status=ERROR, ],
Order [id=1005, createdAt=2022-09-27T13:18:34.410022, createdByUserId=101, status=ERROR, ]
]

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

#20 Stream - Distinct(중복 제거)  (0) 2022.10.09
#19 Stream - Sorted(데이터의 정렬)  (0) 2022.10.08
#17 Stream - Map(데이터의 변형)  (0) 2022.10.06
#16 Stream - Filter  (0) 2022.10.05
#15 Stream이란? / Stream 만들어보기  (1) 2022.10.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 31
글 보관함