BackEnd/Java

[Java] List 안에 있는 Map Value 찾기

Wonol 2022. 1. 15. 17:56
반응형

데이터 목록을 주고 받을 때, List<Map<String, Object>> 형식으로 구성된 리스트로 주고받을 때가 있다.

이러한 경우에 원하는 키워드로 원하는 데이터를 가져오는 방법에 대해 알아보려고 한다.


1. Lambda 사용

- lambda의 stream 을 이용해 데이터에 접근, 리턴을 한다.

(Map<String, Object>을 사용하고자 하였지만, 이전에 사용한 코드(VO)를 재사용해본다... 절대 귀찮아서는 아니다....)

public class blogTest {
	public static void main(String[] args) {
		List<blogVO> blogVOList = new ArrayList<>();
		
		blogVO test1 = new blogVO("hwang", "M", "28", "test@naver.com");
		blogVO test2 = new blogVO("kim", "W", "20", "blog@naver.com");
		blogVO test3 = new blogVO("lee", "W", "30", "write@naver.com");
		blogVO test4 = new blogVO("park", "M", "35", "sample@naver.com");
		
		blogVOList.add(test1);
		blogVOList.add(test2);
		blogVOList.add(test3);
		blogVOList.add(test4);
		
		System.out.println("List 데이터 : " + blogVOList);
		
		String searchStr = "hwang";
		
		Optional<blogVO> result = blogVOList.stream().filter(x -> x.getName().equals(searchStr)).findAny();
		
		System.out.println("결과 : " + result.get());
        System.out.println("결과 중 이름값 : " + result.get().getName());

	}
}
List 데이터 : [blogVO [name=hwang, gender=M, age=28, id=test@naver.com], blogVO [name=kim, gender=W, age=20, id=blog@naver.com], blogVO [name=lee, gender=W, age=30, id=write@naver.com], blogVO [name=park, gender=M, age=35, id=sample@naver.com]]
결과 : blogVO [name=hwang, gender=M, age=28, id=test@naver.com]
결과 중 이름값 : hwang

- 기본적으로는 findAny()를 사용하게되면 리턴타입은 Optional 형태로 전달된다.

- 그렇기 때문에, 마지막에 get()을 호출해야 정해진 리턴타입으로 전달된다.

- 만약, 찾고자 하는 해당 값이 없으면 아래와 같이 에러(Exception)가 발생한다.

String searchStr = "test";
		
Optional<blogVO> result = blogVOList.stream().filter(x -> x.getName().equals(searchStr)).findAny();

System.out.println("결과 : " + result.get());
Exception in thread "main" java.util.NoSuchElementException: No value present
	at java.util.Optional.get(Optional.java:135)
	at blogTest.blogTest.main(blogTest.java:23)

- 이와 같은 상황에 대비하여, 마지막에 get()은 반드시 있다는 가정으로 호출하며, 명확하지 않으면 다음과 같은 방식으로 에러를 처리한다.

String searchStr = "test";
		
Optional<blogVO> result = blogVOList.stream().filter(x -> x.getName().equals(searchStr)).findAny();

//	isPresendt()가 true면 데이터가 있는 것
if(result.isPresent() == true) {
    System.out.println("결과 : " + result.get());
} else {
    System.out.println("데이터가 없습니다.");
}
List 데이터 : [blogVO [name=hwang, gender=M, age=28, id=test@naver.com], blogVO [name=kim, gender=W, age=20, id=blog@naver.com], blogVO [name=lee, gender=W, age=30, id=write@naver.com], blogVO [name=park, gender=M, age=35, id=sample@naver.com]]
데이터가 없습니다.

2. for 문 사용

- 간단하게 반복문을 사용하여, 데이터를 찾는다.

String searchStr = "hwang";

blogVO blogVo = null;
for(int i = 0; i < blogVOList.size(); i++) {
    blogVo = blogVOList.get(i);

    if(blogVo.getName().equals(searchStr)) {
        System.out.println("결과: " + blogVo);
    } else {
        System.out.println("데이터가 없습니다.");
    }
}
List 데이터 : [blogVO [name=hwang, gender=M, age=28, id=test@naver.com], blogVO [name=kim, gender=W, age=20, id=blog@naver.com], blogVO [name=lee, gender=W, age=30, id=write@naver.com], blogVO [name=park, gender=M, age=35, id=sample@naver.com]]
결과: blogVO [name=hwang, gender=M, age=28, id=test@naver.com]
데이터가 없습니다.
데이터가 없습니다.
데이터가 없습니다.

 

- iterator를 사용하여 하는 방법도 있다.(for 문과 비슷하기 때문에 필요하면 찾아보길 바란다.)


참고

- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=varkiry05&logNo=221675366272 

- https://hellcoding.tistory.com/entry/리스트-내부-키워드-검색

반응형