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
반응형