HOME > java > map > hashmap

Java - HashMap.forEach() 사용 방법 및 예제

By JS | 17 Oct 2019

HashMap을 순회할 때 forEach()를 사용할 수 있습니다. forEach()는 다음과 같이 함수형 인터페이스를 인자로 받습니다.

public void forEach(BiConsumer<? super K, ? super V> action)

BiConsumer는 인자 두개를 받고 리턴은 하지 않는 함수형 인터페이스입니다. 따라서 인자를 람다식으로 전달해줄 수 있습니다. 첫번째 인자는 key, 두번째 인자는 value가 전달됩니다.

다음은 forEach로 key와 value를 출력하는 예제입니다. 람다식을 보시면 인자로 key와 value가 전달되고, 리턴 값은 없습니다.

Map<String, Integer> fruits = new HashMap<>();
fruits.put("apple", 1);
fruits.put("banana", 2);
fruits.put("kiwi", 3);

fruits.forEach((key, value)
    -> System.out.println("key: " + key + ", value: " + value));

// key: banana, value: 2
// key: apple, value: 1
// key: kiwi, value: 3

Java8의 함수형 인터페이스를 지원하기 때문에 람다식, 함수형 인터페이스에 대해서 알고 있어야 합니다.

EntrySet.forEach()

HashMap의 EntrySet 클래스도 forEach() 메소드를 갖고 있습니다. 인자를 보면 Consumer라는 함수형 인터페이스를 인자로 받습니다.

final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
  ...
  public final void forEach(Consumer<? super Map.Entry<K,V>> action)
  ...
}

Consumer는 인자 1개를 받고 리턴은 하지 않는 함수형 인터페이스입니다.

다음은 위와 동일한 결과를 출력하는 예제입니다. 람다식을 보시면 Entry 객체 1개를 인자로 받고 있습니다.

Map<String, Integer> fruits = new HashMap<>();
fruits.put("apple", 1);
fruits.put("banana", 2);
fruits.put("kiwi", 3);

fruits.entrySet().forEach((entry) -> System.out.println(
        "key: " + entry.getKey() + ", value: " + entry.getValue()));

// key: banana, value: 2
// key: apple, value: 1
// key: kiwi, value: 3

KeySet.forEach(), Values.forEach()

HashMap의 KeySet과 Values 클래스도 forEach()메소드가 있습니다. Consumer라는 함수형 인터페이스를 인자로 받습니다.

public final void forEach(Consumer<? super V> action)

다음과 같이 사용할 수 있습니다.

Map<String, Integer> fruits = new HashMap<>();
fruits.put("apple", 1);
fruits.put("banana", 2);
fruits.put("kiwi", 3);

fruits.keySet().forEach((key) -> System.out.println("key: " + key));
fruits.values().forEach((value) -> System.out.println("value: " + value));

// key: banana
// key: apple
// key: kiwi
// value: 2
// value: 1
// value: 3

참고