본문 바로가기

카테고리 없음

[JAVA] stream으로 데이터 필터링 하기

 요즘 스트림을 공부하고 있다가 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));
    }
}

 

 

반응형