데이터를 ListMap에 넣어 사용하면서 필요한 내용만 골라서 사용해야 하는 경우 Loop를 돌리는 방법도 있지만 stream을 이용하면 쉽게 필터링이 가능 합니다.

 

stream을 이용하기 때문에 리턴값이 stream으로 넘어오지만 collect를 사용하여 필요한 형태로 가공하여 받아올 수도 있습니다.

 

 

 

 

먼저 List에 있는 데이터를 필터링 하는 방법입니다.

 

        List<String> list = new ArrayList<>();
        list.add("test");
        list.add("atest");
        list.add("test1");
        list.add("btest");
        list.add("ctest");
        list.add("test2");
        list.add("dtest");
        list.add("etest");
       
        Stream<String> filter = list.stream().filter(l->l.startsWith("t"));
        filter.forEach(System.out::println);
 
        List<String> lst = list.stream().filter(l->l.startsWith("t"))
                       .collect(Collectors.toList());
        System.out.println("List : " + lst);

 

첫번째 system.outstream으로 받아온 예제이고

두번째는 collect를 이용하여 다시 List로 받아오는 내용입니다.

 

첫번째 결과는

test
test1
test2

 

두번째는

 

List : [test, test1, test2]

 

 

다음은 Map<String, String>을 필터링 하는 방법입니다.

 

Map<String, String> map = new HashMap<>();
              
map.put("aa", "ba");
map.put("baa", "abb");
map.put("abb", "bbb");
map.put("caa", "acc");
map.put("aac", "aac");
map.put("aad", "cad");
              
Map<String, String> filterMap = map.entrySet()
        .stream().filter(f->f.getKey().startsWith("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("key : " + filterMap);
              
Map<String, String> filterVal = map.entrySet()
        .stream().filter(f->f.getValue().startsWith("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("value : " + filterVal);
              
Map<String, String> conMap = map.entrySet()
        .stream().filter(f->f.getKey().contains("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("contain : " + conMap);

 

첫번째는 key 값이 “a”로 시작하는 내용만 필터링하고

두번째는 value 값이 “a”로 시작하는 내용만 필터링하고

세번째는 key 값에 “a”가 들어있는 내용만 필터링하는 예제 입니다.

 

각각의 결과는

 

key : {aa=ba, abb=bbb, aac=aac, aad=cad}
value : {caa=acc, aac=aac, baa=abb}
contain : {aa=ba, abb=bbb, caa=acc, aac=aac, baa=abb, aad=cad}

 

 

이번에는 Map<Integer, String>을 필터링 하는 방법입니다.

 

Map<Integer, String> intMap = new HashMap<>();
              
intMap.put(10, "ba");
intMap.put(20, "abb");
intMap.put(30, "bbb");
intMap.put(40, "acc");
intMap.put(50, "aac");
intMap.put(60, "cad");
              
Map<Integer, String> intFilter = intMap.entrySet()
        .stream().filter(x->x.getKey() > 30)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("intMap : " + intFilter);
              
              
Map<Integer, String> intMap2 = new HashMap<>();
for(Map.Entry<Integer, String> intmap : intMap.entrySet()) {
        if(intmap.getKey() > 30)
               intMap2.put(intmap.getKey(), intmap.getValue());
}
System.out.println("intMap : " + intMap2);

 

key 값이 숫자인 경우 조건식으로 필터링 하는 방법입니다.

결과는 동일한데 추출하는 방법을 하나는 for문을 사용해 봤습니다.

 

intMap : {50=aac, 40=acc, 60=cad}
intMap : {50=aac, 40=acc, 60=cad}

 - copy coding -


+ Recent posts