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