어제 오늘 내일

[Java HashMap] forEach() 메소드와 람다식 순회 본문

IT/Java

[Java HashMap] forEach() 메소드와 람다식 순회

hi.anna 2025. 10. 18. 00:46

Java 8부터 HashMapforEach() 메소드를 제공해 람다식을 사용한 간결한 순회가 가능해졌습니다.

기존의 keySet(), entrySet()을 이용한 반복보다 코드가 훨씬 짧아지고 가독성이 좋아집니다.

 

 

1. 기본 forEach() 사용

import java.util.HashMap;

public class HashMapForEachBasic {
    public static void main(String[] args) {
        HashMap<String, Integer> scores = new HashMap<>();
        scores.put("kim", 90);
        scores.put("lee", 80);
        scores.put("park", 95);

        scores.forEach((k, v) -> System.out.println(k + " : " + v));
    }
}

실행 결과

kim : 90
lee : 80
park : 95

forEach()(key, value)를 인자로 받는 BiConsumer를 사용합니다.

 

 

2. 조건부 출력

import java.util.HashMap;

public class HashMapForEachCondition {
    public static void main(String[] args) {
        HashMap<String, Integer> scores = new HashMap<>();
        scores.put("kim", 90);
        scores.put("lee", 70);
        scores.put("park", 95);

        scores.forEach((k, v) -> {
            if (v >= 80) {
                System.out.println(k + " passed");
            }
        });
    }
}

실행 결과

kim passed
park passed

람다식 안에서 조건을 걸어 원하는 데이터만 처리할 수 있습니다.

 

 

3. 값 가공하기

import java.util.HashMap;

public class HashMapForEachTransform {
    public static void main(String[] args) {
        HashMap<String, Integer> scores = new HashMap<>();
        scores.put("kim", 90);
        scores.put("lee", 80);
        scores.put("park", 95);

        scores.forEach((k, v) -> System.out.println(k.toUpperCase() + " 점수 = " + (v + 5)));
    }
}

실행 결과

KIM 점수 = 95
LEE 점수 = 85
PARK 점수 = 100

람다식 안에서 키와 값을 자유롭게 가공할 수 있습니다.

 

 

4. 병렬 처리: forEach vs forEachOrdered

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

public class HashMapForEachParallel {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();
        scores.put("kim", 90);
        scores.put("lee", 80);
        scores.put("park", 95);

        // 병렬 스트림 + forEach (순서 보장 없음)
        scores.entrySet().parallelStream()
              .forEach(e -> System.out.println("parallel: " + e));

        // 병렬 스트림 + forEachOrdered (순서 보장)
        scores.entrySet().parallelStream()
              .forEachOrdered(e -> System.out.println("ordered: " + e));
    }
}

forEach()는 순서를 보장하지 않지만, forEachOrdered()를 쓰면 병렬 스트림에서도 입력 순서를 유지할 수 있습니다.

 

 

 

결론

  • forEach((k,v) -> {...}) → 람다식 기반 간단 순회
  • 조건부 처리, 값 변환 등 자유롭게 활용 가능
  • 병렬 스트림과 함께 쓰면 대량 데이터 처리 성능 향상 가능

 

 

반응형
Comments