준호씨의 블로그

Java - HashMap 초깃값을 갖도록 초기화 하는 방법 본문

개발이야기

Java - HashMap 초깃값을 갖도록 초기화 하는 방법

준호씨 2020. 12. 30. 00:56
반응형

HashMap을 초기화하는 방법으로 다음의 방법을 많이 사용하고 있습니다.

Map<String, Object> map = new HashMap<>();
map.put("name", "junho85");
map.put("nickname", "June Kim");

조금 응용해서 한 줄로 만들고 싶다면 아래와 같은 방법을 사용할 수 있습니다.

Map<String, Object> map = new HashMap<>() {{
    put("name", "junho85");
    put("nickname", "June Kim");
}};

 

Java9 이상의 버전을 사용한다면 Map.of()를 이용하는 방법이 있습니다.

Map<String, Object> map = Map.of(
    "name", "junho85",
    "nickname", "June Kim"
);

기존의 방법들보다 심플하긴 하지만 Immutable로 생성되기 때문에 이후에 값을 조작하기 어렵다는 점은 있습니다. 그리고 value에 null을 넣을 수 없습니다.

하지만 앞으로는 이런 방식이 대세가 되겠죠? Functional Programming이 점점 대중화되면서 Immutable 사용이 점점 더 선호되고 있습니다.

아 그리고 Map.of를 사용하면 개수 제한이 있습니다.

10개까지로 제한되어 있으니 주의하시기 바랍니다.

of 메서드를 확인해 보면 다음과 같이 파라미터가 하드 코딩되어 있습니다.

즉 개수를 늘리려면 더 만들어 주어야 합니다.

개수가 10개가 넘어가면 ofEntries를 사용하면 됩니다.

Map<String, Object> test = Map.ofEntries(
        new AbstractMap.SimpleEntry<>("name", "Kim"),
        new AbstractMap.SimpleEntry<>("nickname", "June Kim"),
        new AbstractMap.SimpleEntry<>("a", "June Kim"),
        new AbstractMap.SimpleEntry<>("b", "June Kim"),
        new AbstractMap.SimpleEntry<>("c", "June Kim"),
        new AbstractMap.SimpleEntry<>("d", "June Kim"),
        new AbstractMap.SimpleEntry<>("e", "June Kim"),
        new AbstractMap.SimpleEntry<>("f", "June Kim"),
        new AbstractMap.SimpleEntry<>("g", "June Kim"),
        new AbstractMap.SimpleEntry<>("h", "June Kim"),
        new AbstractMap.SimpleEntry<>("i", "June Kim"),
        new AbstractMap.SimpleEntry<>("j", "June Kim")
);

좀 줄이면 아래처럼 가능합니다.

Map<String, Object> test = Map.ofEntries(
        Map.entry("name", "Kim"),
        Map.entry("nickname", "June Kim"),
        Map.entry("a", "June Kim"),
        Map.entry("b", "June Kim"),
        Map.entry("c", "June Kim"),
        Map.entry("d", "June Kim"),
        Map.entry("e", "June Kim"),
        Map.entry("f", "June Kim"),
        Map.entry("g", "June Kim"),
        Map.entry("h", "June Kim"),
        Map.entry("i", "June Kim"),
        Map.entry("j", "June Kim")
);

 

Stream.of와 collect를 활용하는 방법도 있습니다.

Map<String, Object> map = Stream.of(new Object[][] {
        { "name", "junho85" },
        { "nickname", "June Kim" },
}).collect(Collectors.toMap(data -> (String) data[0], data -> data[1]));

다만 타입 캐스팅도 들어가고 좀 쓸데없이 복잡해 보입니다.

 

아무튼 개인적으로 현재로는 값의 변경이 필요하다면 아래 방법을 사용하고요.

Map<String, Object> map = new HashMap<>() {{
    put("name", "junho85");
    put("nickname", "June Kim");
}};

Immutable로 한다면 아래 방법을 사용하고 있습니다.

Map<String, Object> map = Map.of(
    "name", "junho85",
    "nickname", "June Kim"
);

아직 좀 부족한 느낌인데요. 버전업이 되다 보면 좀 더 좋은 방법들이 나오지 않을까 기대해 봅니다.

반응형
Comments