요즘 스트림을 공부하고 있다가 SQL 문에서가 아닌 자바단에서 필터링을 동적으로 할 수 있는 방식을 만들어 보았다.
null 일 경우에는 체크가 되지 않고(true 로 필터링 되지 않음) null 이 아닐 경우에는 체크하여 각 필드와 같은 데이터를 리스트로 반환한다.
스트림을 사용하면 for문과 달리 직접 요소를 반복하지 않아 편리하고 가독성이 좋은 것 같다.
아래는 멤버리스트를 조회하는 클래스인데 조건 필드에 데이터가 있을 경우에만 비교해서 리스트를 반환해준다.
public class MemberTest {
private List<Members> members;
public MemberTest(List<Members> members) {
this.members = members;
}
public List<Members> getByRequest(String name, Long id) {
return members.stream()
.filter(eqName(name))
.filter(eqMemberId(id))
.collect(Collectors.toList());
}
public static Predicate<Members> eqName(String name) {
return p -> name == null ? true : p.getName().equals(name);
}
public static Predicate<Members> eqMemberId(Long memberNo) {
return p -> memberNo == null ? true : p.getId().equals(memberNo);
}
}
테스트 코드
public class test {
MemberTest memberTest = new MemberTest(Arrays.asList(new Members( "name1", 1l),
new Members( "name2", 2l),
new Members( "name3", 3l),
new Members( "name4", 4l),
new Members( "name4", 5l)));
@Test
public void test(){
System.out.println("Member no 가 1인경우============");
System.out.println(memberTest.getByRequest(null, 1l));
System.out.println("둘다 filter 하지 않는경우========");
System.out.println(memberTest.getByRequest(null, null));
System.out.println("member 이름이 name4인 경우========");
System.out.println(memberTest.getByRequest("name4", null));
}
}
반응형