본문 바로가기
[IT] JAVA

[자바] Map의 Key 값 혹은 Value 값 List 생성, 객체 List에서 특정 값 List 생성

by 오리엔탈킴 2022. 1. 13.

 

안녕하세요,

오늘은 간혹 코딩 테스트 혹은 실제 프로젝트에서 필요한 아래 2개의 케이스에 대해 구현하는 방법을 정리해보겠습니다.

 

1. Map의 Key값 List 생성 (Key값 추출)  /  Value값 List 생성 (Value값 추출)

Java의 Key, Value로 구성된 HashMap에서 Key값만 가져오기 혹은 Value값만 가져와서 List를 만들어 보도록 하겠습니다.

먼저 아래와 같이 이름과 ID로 구성된 임의의 Member Map을 생성을 합니다.

 

Map<String, Integer> memberMap = new HashMap<>();

memberMap.put("킴오리", 30);
memberMap.put("이오리", 50);
memberMap.put("엔탈", 10);

 

이 Map에서 Key로만 구성된 List 혹은 Value로만 구성된 List는 매우 간단합니다. 

 

List<String> keyList = new ArrayList<>(memberMap.keySet());
List<Integer> valueList = new ArrayList<>(memberMap.values());
		
System.out.println("Key List: " + keyList.toString());
System.out.println("Value List: " + valueList.toString());

출력 결과: 

Key List: [킴오리, 이오리, 엔탈]
Value List: [30, 50, 10]

 

Map에서 특정 조건에 맞는 Key값 추출 / 조건에 맞는 Value값 추출

만약 어떠한 특정 조건에 맞는 Key 값 혹은 Value값만 추출하여 List를 만든다고 하면, 아래와 같이 forEach와 람다식을 이용해서 간단하게 구현이 가능합니다. (JAVA 버전 8 이상 지원)

 

List<String> keyList2 = new ArrayList<>();
List<Integer> valueList2 = new ArrayList<>();
		
memberMap.forEach((k,v) -> {
	if( k.length() >= 3 ) keyList2.add(k); // 키값 글자 길이가 3이상인 것만 저장
	if( v > 20 ) valueList2.add(v); // Value가 20 이상인 것만 저장
	});

System.out.println("Key List2: " + keyList2.toString());
System.out.println("Value List2: " + valueList2.toString());

출력 결과: 

Key List2: [킴오리, 이오리]
Value List2: [30, 50]

 

 

2. 객체 List에서 특정 값(엘리먼트) 추출하여 List 생성

다음으로, 특정 객체로 된 자바 리스트에서 특정 값만 가져와서 String 혹은 int 등으로 구성된 리스트를 생성하는 것을 구현해보겠습니다. JAVA 8에 추가된 stream()을 이용할 거라서 자바 버전 8부터 동작합니다.

아래와 같이 Member라는 객체를 생성하고, Member로 구성된 리스트를 임의로 생성을 하였습니다. 그 후 이 리스트에서 만약 특정 값으로만 구성된 신규 리스트를 생성하고자 하는데, 만약 Name으로만 구성된 String 리스트를 생성하고자 한다고 하면 아래와 같이 Stream.map을 이용해 Name을 추출 후 Collectors.toList로 리스트로 만들어 줍니다.

 

List<String> nameList = memberList.stream().map(Member::getName).collect(Collectors.toList());

 

import java.util.*;
import java.util.stream.*;

public class listFromObjectList {
	// Member 객체 정의 (Getter,Setter,생성자 정의)
	static class Member { 
		private String Name;
		private int Id;
		
		public String getName() {
			return Name;
		}
		public void setName(String name) {
			Name = name;
		}
		public int getId() {
			return Id;
		}
		public void setId(int id) {
			Id = id;
		}
		
		public Member(String name, int id) {
			super();
			Name = name;
			Id = id;
		}
	} 
	// Main 함수
	public static void main(String[] args) {
		// Member 리스트 생성
		List<Member> memberList = new ArrayList<>();
		memberList.add(new Member("킴오리", 30));
		memberList.add(new Member("이오리", 50));
		memberList.add(new Member("엔탈", 10));
		
		// stream.map 이용하여 멤버 이름으로만 된 collect toList 
		List<String> nameList = memberList.stream()
				.map(Member::getName)
				.collect(Collectors.toList());
		/* Name List 출력 */ System.out.println("Name List: " + nameList.toString());
		
		// stream.map 이용하여 멤버 아이디로만 된 collect toList 
		List<Integer> idList = memberList.stream()
				.map(Member::getId)
				.collect(Collectors.toList());
		/* ID List 출력 */ System.out.println("ID List: " + idList.toString());
	}
}

출력 결과: 

Name List: [킴오리, 이오리, 엔탈]
ID List: [30, 50, 10]

 

 

 

반응형

댓글