[Java] Stream Filter 연산
in Java on Java 개발 기록
stream.filter()
메서드는 filter 내 조건이 true를 만족하는 요소들만을 선택하여 새로운 스트림을 반환한다. 기존 시스템이 레거시라 자바에서 데이터를 처리해야 할 상황이 와서 뇌에 기록(기억).
Stream Filter 예제
public class ExStreamFilter {
public static void main(String[] args) {
List<AccSubItem> AccSubItems = Arrays.asList(
new AccSubItem("A123", "10", new BigDecimal(100000)),
new AccSubItem("A201", "10", new BigDecimal(120000)),
new AccSubItem("A222", "20", new BigDecimal(1000)),
new AccSubItem("A510", "10", new BigDecimal(27000)),
new AccSubItem("A610", "20", new BigDecimal(431000)),
new AccSubItem("A105", "10", new BigDecimal(12346))
);
//1. 일반적인 filter
List<AccSubItem> filter1 = AccSubItems.stream().filter(accSubItem -> accSubItem.getAccAmt().compareTo(new BigDecimal(100000)) >= 0)
.collect(Collectors.toList());
System.out.println("filter1: " + filter1);
//2. Predicate 를 이용한 필터링
//Predicate 를 사용하여 동일한 조건으로 구현할 수 있습니다. Predicate 는 특정 조건을 표현하는 함수형 인터페이스입니다.
List<AccSubItem> filter2 = AccSubItems.stream().filter(accSubItem -> isAmountMoreThan100000().test(accSubItem))
.collect(Collectors.toList());
System.out.println("filter2: " + filter2);
//3. filter 2개 조건, DepWdrTypCd 이면서 100000 원 이상
Predicate<AccSubItem> isEquals20 = item -> "20".equals(item.getDepWdrTypCd());
List<AccSubItem> filter3 = AccSubItems.stream().filter(accSubItem -> isAmountMoreThan100000().test(accSubItem))
.filter(isEquals20)
.collect(Collectors.toList());
System.out.println("filter3: " + filter3);
//4. filter3 과 동일한 조건
List<AccSubItem> filter4 = AccSubItems.stream().filter(accSubItem -> {
if (accSubItem.getAccAmt().compareTo(new BigDecimal("100000")) >= 0
&& "20".equals(accSubItem.getDepWdrTypCd())
) {
return true;
}
return false;
}).collect(Collectors.toList());
System.out.println("filter4: " + filter4);
}
// Predicate 정의 (100000 원 이상)
static Predicate<AccSubItem> isAmountMoreThan100000() {
return item -> item.getAccAmt().compareTo(new BigDecimal("100000")) >= 0;
}
}
filter1: [AccSubItem{accId='A123', depWdrTypCd='10', accAmt=100000}, AccSubItem{accId='A201', depWdrTypCd='10', accAmt=120000}, AccSubItem{accId='A610', depWdrTypCd='20', accAmt=431000}]
filter2: [AccSubItem{accId='A123', depWdrTypCd='10', accAmt=100000}, AccSubItem{accId='A201', depWdrTypCd='10', accAmt=120000}, AccSubItem{accId='A610', depWdrTypCd='20', accAmt=431000}]
filter3: [AccSubItem{accId='A610', depWdrTypCd='20', accAmt=431000}]
filter4: [AccSubItem{accId='A610', depWdrTypCd='20', accAmt=431000}]
AccSubItem 클래스 일부
class AccSubItem implements Comparable<AccSubItem> {
//getter, setter 생략
@Override
public int compareTo(AccSubItem other) {
return other.getAccAmt().compareTo(this.getAccAmt()); // 내림차순으로 정렬
}
@Override
public String toString() {
return "AccSubItem{" +
"accId='" + accId + '\'' +
", depWdrTypCd='" + depWdrTypCd + '\'' +
", accAmt=" + accAmt +
'}';
}
}