Post

Java 맵 반복

1. Map의 entrySet(), keySet(), values() 메서드 설명

세 가지 방법을 사용하여 맵을 반복하기 전에 이러한 방법이 수행하는 작업에 대한 설명이다.

  • entrySet() - 요소가 Map.Entry 클래스에 있는 맵의 컬렉션 뷰를 반환한다. entry.getKey() 메서드는 키를 반환하고 entry.getValue()는 해당 값을 반환한다.

  • keySet() - 이 맵에 포함된 모든 키를 Set으로 반환한다.

  • values() - 이 맵에 포함된 모든 값을 Set으로 반환한다.

2. for 루프 사용

1) entrySet() 사용

entrySet()을 사용하여 맵을 반복하는 방법이다.

1
2
3
4
5
public void iterateUsingEntrySet(Map<String, Integer> map) {
    for (Map.Entry<String, Integer> entry : map.entrySet()) {
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
}

맵에서 항목 집합을 추출한 다음 고전적인 for-each 접근 방식을 사용하여 항목을 반복한다.

2) keySet() 사용

keySet() 메서드를 사용하여 맵의 모든 키를 가져온 다음 각 키별로 맵을 반복할 수 있다.

1
2
3
4
5
public void iterateUsingKeySetAndForeach(Map<String, Integer> map) {
    for (String key : map.keySet()) {
        System.out.println(key + ":" + map.get(key));
    }
}

3) values()를 사용하여 값 반복

어떤 키가 연관되어 있는지에 관계없이 맵의 값에만 관심이 있는 경우가 있다. 이 경우 values()가 최선의 선택이다.

1
2
3
4
5
public void iterateValues(Map<String, Integer> map) {
    for (Integer value : map.values()) {
        System.out.println(value);
    }
}

3. Iterator

반복을 수행하는 또 다른 방법은 Iterator를 사용하는 것이다. 그리고 메소드가 Iterator 객체와 어떻게 작동하는지 확인한다.

1) Iterator와 entrySet()

Iterator와 entrySet()을 사용하여 맵을 반복한다.

1
2
3
4
5
6
7
public void iterateUsingIteratorAndEntry(Map<String, Integer> map) {
    Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry<String, Integer> entry = iterator.next();
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
}

entrySet()에 의해 반환된 Set의 iterator() API를 사용하여 Iterator 인스턴스를 얻는 방법이다. 그런 다음 iterator.next()를 사용하여 Iterator를 반복한다.

2) Iterator와 keySet()

Iterator와 keySet()을 사용하여 맵을 반복할 수 있다.

1
2
3
4
5
6
7
public void iterateUsingIteratorAndKeySet(Map<String, Integer> map) {
    Iterator<String> iterator = map.keySet().iterator();
    while (iterator.hasNext()) {
        String key = iterator.next();
        System.out.println(key + ":" + map.get(key));
    }
}

3) Iterator와 values()

Iterator와 values() 메서드를 사용하여 맵의 값을 탐색할 수도 있다.

1
2
3
4
5
6
7
public void iterateUsingIteratorAndValues(Map<String, Integer> map) {
    Iterator<Integer> iterator = map.values().iterator();
    while (iterator.hasNext()) {
        Integer value = iterator.next();
        System.out.println("value :" + value);
    }
}

4. 람다와 스트림 API 사용

자바 버전 8부터 Java는 Stream API와 람다를 도입했다. 이러한 기술을 사용하여 맵을 반복하는 방법이다.

1) forEach() 및 Lambda 사용

Java 8의 다른 대부분과 마찬가지로 이것은 대안보다 훨씬 간단하다. forEach() 메소드를 사용한다.

1
2
3
public void iterateUsingLambda(Map<String, Integer> map) {
    map.forEach((k, v) -> System.out.println((k + ":" + v)));
}

이 경우 맵을 항목 집합으로 변환할 필요가 없다.

또한 키부터 시작하여 맵을 반복할 수 있다.

1
2
3
public void iterateByKeysUsingLambda(Map<String, Integer> map) {
    map.keySet().foreach(k -> System.out.println((k + ":" + map.get(k))));
}

유사하게 values() 메서드와 동일한 기술을 사용할 수 있다.

1
2
3
public void iterateValuesUsingLambda(Map<String, Integer> map) {
    map.values().forEach(v -> System.out.println(("value: " + v)));
}

2) 스트림 API 사용

Stream API는 Java 8의 중요한 기능 중 하나이다. 이 기능을 사용하여 맵을 반복할 수도 있다.

Stream API는 추가 Stream 처리를 계획할 때 사용해야 한다. 그렇지 않으면 앞에서 설명한 것처럼 단순한 forEach()일 뿐이다.

Stream API가 어떻게 작동하는지 보기 위해 entrySet()를 예로 들어 본다.

1
2
3
4
5
public void iterateUsingStreamAPI(Map<String, Integer> map) {
    map.entrySet().stream()
      // ... some other Stream processings
      .forEach(e -> System.out.println(e.getKey() + ":" + e.getValue()));
}

keySet()values() 메서드와 함께 Stream API를 사용하는 것은 위의 예와 매우 유사하다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.