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;
}
}
즉, 문제는 문법이 아니라 비즈니스 의도가 절차적 코드에 묻힌다는 점입니다.
바로 이 지점에서 Lambda와 Stream이 등장합니다.
여기서 먼저 바로잡아야 할 포인트가 있습니다.
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;
}
}