[코틀린 쿡북] to로 Pair 인스턴스 생성하기

Pair 인스턴스?

  • Kotlin Pair는 Map의 아이템으로 사용한다.
  • Java에서는 Entry 클래스를 Map의 아이템으로 사용한다. Map에 데이터를 넣은 채로 초기화하기 위해서 다양한 방법이 있다.

Map 초기화 방법 비교

1. Java Map 초기화

1
2
3
4
Map<String, String> map = Stream.of(new String[][] {
{ "Hello", "World" },
{ "Mark", "Oh" },
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));
  • 초기화 할 데이터를 String 2차원 배열로 생성, Stream의 collect 메소드와 Collectors의 toMap()을 활용하는 방법이다. 매우 길다.
1
2
3
4
Map<String, String> map = Stream.of(
new AbstractMap.SimpleEntry<>("idea", 1),
new AbstractMap.SimpleEntry<>("mobile", 2))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
  • 위의 방법과 똑같이 Collectors.toMap()을 사용하지만 String 2차원 배열을 사용하는 것이 아니라 Map의 요소인 Entry 클래스를 사용하는 방법이다. 이것 또한 매우 길고 오히려 배열을 사용하는 것보다 더 가독성이 떨어지게 느껴진다..
1
2
3
4
5
6
7
// immutable map
Map<String, String> emptyMap = Map.of();
Map<String, String> singletonMap = Map.of("key1", "value");
Map<String, String> immutableMap = Map.of("key1","value1", "key2", "value2");

// mutable map
Map<String, String> mutableMap = new HashMap<String, String>(Map.of("key1","value1", "key2", "value2"));
  • Java9부터 Map.of()가 등장하게되는데 이전 코드들에 비해서 상당히 축약되어 보기 편해진건 맞지만 단점이 존재한다. 최대 10개까지 밖에 초기화하지 못하고, 일반 배열처럼 ,를 기준으로 나열되있어서 어떤 것이 key인지 value인지 한눈에 잘 들어오지 않게된다.
  • 그리고 Map.of() 메소드는 immutable한 Map을 생성하기 때문에 mutable한 Map을 생성하고싶다면 Map.of()로 생성한 결과를 Map 인터페이스에 담아서 사용해야한다.

2. Kotlin Map 초기화

1
2
3
4
5
6
7
8
// immutable map
val pairToMap = mapOf(
Pair("key1", "value1"),
Pair("key2", "value2")
)

val immutableMap = mapOf("key" to "value")
val mutableMap = mutableMapOf("key" to "value")
  • kotlin에서는 mapOf라는 static 메소드가 존재하고, Pair 인스턴스를 직접 생성해서 Map을 초기화할 수 있다.
  • 일반적으로는 to라는 중위(inflix)함수를 사용해서 초기화한다.
  • mutable한 map으로 초기화하려면 mapOf() 대신 mutableMapOf()를 사용하면 된다.

References

0%