1. 왜 만들어졌을까?

결제 완료 주문 ID만 뽑고 싶다면?

import java.util.ArrayList;
import java.util.List;

public class OrderQueryService {
    public List<String> findPaidOrderIds(List<Order> orders) {
        List<String> paidOrderIds = new ArrayList<>();

        for (Order order : orders) {
            if (order.getStatus() == OrderStatus.PAID) {
                paidOrderIds.add(order.getId());
            }
        }

        return paidOrderIds;
    }
}

동작은 맞지만, 읽는 사람 입장에서는?

즉, 문제는 문법이 아니라 비즈니스 의도가 절차적 코드에 묻힌다는 점입니다.

더 직접적으로 표현할 수 없을까?

바로 이 지점에서 LambdaStream이 등장합니다.


2. Lambda는 무엇을 바꿨을까?

여기서 먼저 바로잡아야 할 포인트가 있습니다.

Lambda는 for-loop 자체를 대체하는 문법이 아닙니다.

Lambda의 핵심은 "동작을 값처럼 전달한다"는 점입니다.

즉, 반복문을 없애는 주인공은 Stream이고,

Lambda는 그 안에 들어가는 조건식과 변환식을 더 간결하게 표현하는 도구입니다.

먼저, 조건을 바깥으로 꺼내보자

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class OrderQueryService {
    public List<String> findOrderIds(List<Order> orders, Predicate<Order> condition) {
        List<String> orderIds = new ArrayList<>();

        for (Order order : orders) {
            if (condition.test(order)) {
                orderIds.add(order.getId());
            }
        }

        return orderIds;
    }
}