본문 바로가기
공부/프로그래밍

[java] List 안에 Map value 찾기(lambda 사용)

by demonic_ 2019. 10. 13.
반응형

lambda 의 stream 을 이용해 데이터에 접근, 찾으면 리턴하도록 한다.

    public static void main(String[] args) {
        Map<String, Object> map1 = new HashMap<>();
        Map<String, Object> map2 = new HashMap<>();
        Map<String, Object> map3 = new HashMap<>();
        Map<String, Object> map4 = new HashMap<>();

        map1.put("name", "네이버");
        map1.put("date", "2019-01-01");

        map2.put("name", "카카오");
        map2.put("date", "2019-04-01");

        map3.put("name", "구글");
        map3.put("date", "2019-03-01");

        map4.put("name", "페이스북");
        map4.put("date", "2019-02-01");

        List<Map> list = new LinkedList<>();
        list.add(map1);
        list.add(map2);
        list.add(map3);
        list.add(map4);

        System.out.println(list);

        String searchText = "구글";

        Map result = list.stream().filter(x -> x.get("name").equals(searchText)).findAny().get();
        System.out.println(result);
    }

결과

[{date=2019-01-01, name=네이버}, {date=2019-04-01, name=카카오}, {date=2019-03-01, name=구글}, {date=2019-02-01, name=페이스북}]
{date=2019-03-01, name=구글}

 

findAny() 를 사용하면 Optional 형태로 리턴된다.

때문에 .get()을 호출해야 가진 유형으로 리턴해준다.

그런데 만약 값이 없다면 Exception이 발생한다

 

String searchText = "테스트";

Map result = list.stream().filter(x -> x.get("name").equals(searchText)).findFirst().get();
System.out.println(result);

결과

Exception in thread "main" java.util.NoSuchElementException: No value present
	at java.base/java.util.Optional.get(Optional.java:148)
	at com.main.TestClass.main(TestClass.java:60)

때문에 마지막에 get() 은 반드시 있다는 가정하에 호출해야 하고, 만약 명확하지 않다면 다음과 같은 방식으로 처리한다

String searchText = "테스트";

Optional result = list.stream().filter(x -> x.get("name").equals(searchText)).findFirst();
System.out.println(result);
if (result.isPresent() == true) {
    System.out.println(result.get());
} else {
    System.out.println("데이터 없습니다 => " + searchText);
}

결과

[{date=2019-01-01, name=네이버}, {date=2019-04-01, name=카카오}, {date=2019-03-01, name=구글}, {date=2019-02-01, name=페이스북}]
Optional.empty
데이터 없습니다 => 테스트
반응형

댓글