티스토리 뷰

Backend/Java8

#20 Stream - Distinct(중복 제거)

RadderNepa 2022. 10. 9. 02:53

● 도입

- 중복되는 데이터가 제거된 stream을 return 한다.
[Stream interface에 있는 distinct method]

public interface Stream<T> extends BaseStream<T, Stream<T>> {
	Stream<T> distinct();
}

 

 

● 실습

1. 중복된 숫자 제거

package com.fastcampus.functionalprogramming.chapter6;

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

public class Chapter6Section6 {
	public static void main(String[] args) {
		List<Integer> numbers = Arrays.asList(3, -5, 4, -5, 2, 3);
		List<Integer> distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());
		System.out.println(distinctNumbers);
	}
}

 

2.

①. orders List에서
②. createdByUserId만 추출해서
③. 중복되는 createdByUserId는 제거하고
④. 정렬된
⑤. createdByUserId가 담긴 List를 만들자.

package com.fastcampus.functionalprogramming.chapter6.model;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

public class Order {
	private long id;
	private LocalDateTime createdAt;
	private long createdByUserId;
	private OrderStatus status;
	private BigDecimal amount;
	private List<OrderLine> orderLines;

	public enum OrderStatus {
		CREATED,
		IN_PROGRESS,
		ERROR,
		PROCESSED
	}

	public long getId() {
		return id;
	}

	public Order setId(long id) {
		this.id = id;
		return this;
	}

	public LocalDateTime getCreatedAt() {
		return createdAt;
	}

	public Order setCreatedAt(LocalDateTime createdAt) {
		this.createdAt = createdAt;
		return this;
	}

	public long getCreatedByUserId() {
		return createdByUserId;
	}

	public Order setCreatedByUserId(long createdByUserId) {
		this.createdByUserId = createdByUserId;
		return this;
	}

	public OrderStatus getStatus() {
		return status;
	}

	public Order setStatus(OrderStatus status) {
		this.status = status;
		return this;
	}

	public BigDecimal getAmount() {
		return amount;
	}

	public Order setAmount(BigDecimal amount) {
		this.amount = amount;
		return this;
	}

	public List<OrderLine> getOrderLines() {
		return orderLines;
	}

	public Order setOrderLines(List<OrderLine> orderLines) {
		this.orderLines = orderLines;
		return this;
	}

	@Override
	public String toString() {
		return "Order [id=" + id + ", " + (createdAt != null ? "createdAt=" + createdAt + ", " : "")
				+ "createdByUserId=" + createdByUserId + ", " + (status != null ? "status=" + status + ", " : "")
				+ (amount != null ? "amount=" + amount + ", " : "")
				+ (orderLines != null ? "orderLines=" + orderLines : "") + "]";
	}
}
package com.fastcampus.functionalprogramming.chapter6;

import java.time.LocalDateTime;
import java.time.ZoneId;
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;

public class Chapter6Section6 {
	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));
		
		Order order2 = new Order();
		order2.setId(1002);
		order2.setStatus(OrderStatus.ERROR);	   // enum 사용
		order2.setCreatedByUserId(103);
		order2.setCreatedAt(now.minusHours(1));
		
		Order order3 = new Order();
		order3.setId(1003);
		order3.setStatus(OrderStatus.PROCESSED);   // enum 사용
		order3.setCreatedByUserId(102);
		order3.setCreatedAt(now.minusHours(36));
		
		Order order4 = new Order();
		order4.setId(1004);
		order4.setStatus(OrderStatus.ERROR);	   // enum 사용
		order4.setCreatedByUserId(104);
		order4.setCreatedAt(now.minusHours(40));
		
		Order order5 = new Order();
		order5.setId(1005);
		order5.setStatus(OrderStatus.IN_PROGRESS); // enum 사용
		order5.setCreatedByUserId(101);
		order5.setCreatedAt(now.minusHours(10));
		
		List<Order> orders = Arrays.asList(order1, order2, order3, order4, order5);
		
		/* 
		 * 0. orders List에서
		 * 1. createdByUserId만 추출해서
		 * 2. 중복되는 createdByUserId는 제거하고
		 * 3. 정렬된
		 * 4. createdByUserId가 담긴 List를 만들자.
		 */
		// OOP 방식으로 했다면 코드가 아래 내용에 비해 매우 길어졌을 것이다.
		List<Long> userIds = orders.stream()
						.map(Order::getCreatedByUserId)
						.distinct()
						.sorted()
						.collect(Collectors.toList());
		System.out.println(userIds);
	}
}

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함