Kotlin에서 목록을 지도로 변환

David Mbochi Njonge 2023년6월20일
  1. 코틀린 프로젝트 생성
  2. associate() 메서드를 사용하여 Kotlin에서 목록을 지도로 변환
  3. associateBy() 메서드를 사용하여 Kotlin에서 목록을 지도로 변환
  4. associateWith() 메서드를 사용하여 Kotlin에서 목록을 지도로 변환
  5. groupBy() 메서드를 사용하여 Kotlin에서 목록을 지도로 변환
  6. 결론
Kotlin에서 목록을 지도로 변환

Kotlin은 다양한 컬렉션을 제공합니다. 가장 일반적인 것은 List, MapSet입니다. 애플리케이션을 개발할 때 특정 목표를 달성하기 위해 한 유형의 컬렉션을 다른 유형으로 변환해야 하는 상황이 있습니다.

예를 들어, 중복 요소가 포함된 목록이 있을 수 있으며 세트는 중복 요소를 허용하지 않는다는 것을 알고 있습니다. 목록을 집합으로 변환할 수 있으며 논리를 작성하지 않고 중복 항목이 제거됩니다.

Kotlin을 사용하면 컬렉션에서 다른 유형의 컬렉션으로 변환하는 데 사용할 수 있는 다양한 메서드를 제공하여 이러한 작업을 수행할 수 있습니다.

이 자습서에서는 List 데이터 구조를 Map 데이터 구조로 변환하는 데 활용할 수 있는 다양한 방법을 배웁니다.

코틀린 프로젝트 생성

IntelliJ를 열고 새로 만들기 > 파일> 프로젝트를 선택합니다. 열리는 창에서 프로젝트 이름을 list-to-map으로 입력하고 Language 섹션에서 Kotlin을 선택하고 Build System 섹션에서 IntelliJ를 선택합니다.

마지막으로 Create 버튼을 눌러 Kotlin 프로젝트를 생성합니다. kotlin 폴더 아래에 Main.kt 파일을 만들고 다음 코드를 복사하여 파일에 붙여넣습니다.

data class Employee(val id: Number,
                    val firstName: String,
                    val email: String);

fun fetchEmployees(): List<Employee> {
    return listOf(
        Employee(1,"john", "john@gmail.com"),
        Employee(2,"mary","mary@gmail.com"),
        Employee(3,"jane","jane@gmail.com"),
        Employee(3,"abdul","abdul@gmail.com")
    );
}

이 예제에서는 fetchEmployees() 메서드에서 직원 목록 List<Employee>을 만드는 데 도움이 되는 Employee라는 데이터 클래스를 만들었습니다.

이 자습서에서 다룰 모든 예제에서 fetchEmployees() 메서드를 사용합니다.

associate() 메서드를 사용하여 Kotlin에서 목록을 지도로 변환

다음 코드를 복사하여 fetchEmployees() 함수 뒤에 Main.kt 파일에 붙여넣습니다.

fun usingAssociate(employees: List<Employee>): Map<Number, String> {
    return employees.associate { employee ->
        Pair(employee.id, employee.email)
    }
}

fun main(){
    println(usingAssociate(fetchEmployees()));
}

이 예에서는 employee.id를 키로 포함하고 employee.email을 문자열 Map<Number, String>으로 포함하는 맵으로 목록을 변환했습니다. 맵의 삽입 순서는 목록에 있던 대로 유지됩니다.

associate() 메서드는 목록 요소에서 변환 함수를 사용하여 쌍을 만들고 이 쌍을 맵으로 반환하는 Iterable 인터페이스의 확장 함수입니다.

생성된 쌍의 키와 값 모두로 반환하려는 값을 명시적으로 제공했습니다. 쌍의 키가 복제되면 이전 쌍이 새 쌍으로 대체됩니다.

예를 들어 목록에 동일한 id가 3인 두 개의 개체가 있는데 첫 번째는 jane이고 두 번째는 abdul입니다. 요소가 지도에 삽입되면 janeabdul로 대체됩니다.

위의 코드를 실행하고 출력이 아래와 같은지 확인합니다.

{1=john@gmail.com, 2=mary@gmail.com, 3=abdul@gmail.com}

associateBy() 메서드를 사용하여 Kotlin에서 목록을 지도로 변환

이전 예제를 주석 처리하고 주석 뒤에 다음 코드를 복사하여 Main.kt 파일에 붙여넣습니다.

fun usingAssociateBy(employees: List<Employee>): Map<Number, Employee> {
    return employees.associateBy { employee: Employee ->
        employee.id
    }
}

fun main(){
    println(usingAssociateBy(fetchEmployees()));
}

이 예제에서는 employee.id를 키로 포함하는 맵으로 목록을 변환했으며 직원 개체의 값은 Map<Number, Employee> 입니다.

associateBy() 메서드는 Iterable 인터페이스의 확장 기능이기도 합니다. 맵에서 키로 사용되는 값만 전달하면 됩니다.

keySelector 기능은 목록의 각 개체에서 이 키를 가져와 지도에 적용합니다. 맵의 값은 목록의 객체가 됩니다.

keySelector 함수는 위에서 본 것처럼 값이 3인 두 개의 복제본을 검색합니다. 이전 요소는 새 요소로 대체됩니다.

이 코드를 실행하고 출력이 아래와 같은지 확인합니다.

{1=Employee(id=1, firstName=john, email=john@gmail.com),
 2=Employee(id=2, firstName=mary, email=mary@gmail.com),
 3=Employee(id=3, firstName=abdul, email=abdul@gmail.com)}

associateWith() 메서드를 사용하여 Kotlin에서 목록을 지도로 변환

이전 예제를 주석 처리하고 주석 뒤에 다음 코드를 복사하여 Main.kt 파일에 붙여넣습니다.

fun usingAssociateWith(employees: List<Employee>): Map<Employee, Number> {
    return employees.associateWith { employee ->
        employee.id
    }
}

fun main(){
    println(usingAssociateWith(fetchEmployees()));
}

이 예제에서는 직원 개체를 키로 포함하고 employee.idMap<Employee, Number> 값으로 포함하는 맵으로 목록을 변환했습니다.

associateWith() 메서드는 Iterable 인터페이스의 확장 함수이며 맵에서 값으로 사용할 요소만 전달하면 됩니다. valueSelector 기능은 목록의 각 개체에서 값을 가져와 맵에 적용합니다.

맵의 키는 목록의 요소가 됩니다. 개체는 맵의 키이므로 중복 항목이 없지만 맵의 두 요소는 3 값을 갖습니다.

이 코드를 실행하고 출력이 아래와 같은지 확인합니다.

{Employee(id=1, firstName=john, email=john@gmail.com)=1,
 Employee(id=2, firstName=mary, email=mary@gmail.com)=2,
 Employee(id=3, firstName=jane, email=jane@gmail.com)=3,
 Employee(id=3, firstName=abdul, email=abdul@gmail.com)=3}

groupBy() 메서드를 사용하여 Kotlin에서 목록을 지도로 변환

이전 예제를 주석 처리하고 주석 뒤에 다음 코드를 복사하여 Main.kt 파일에 붙여넣습니다.

fun usingGroupBy(employees: List<Employee>): Map<Number, List<Employee>> {
    return employees.groupBy { employee: Employee ->
        employee.id
    }
}

fun main(){
    println(usingGroupBy(fetchEmployees()));
}

첫 번째 예에서 목록을 맵으로 변환할 때 모든 중복 항목이 대체되는 것을 확인했습니다. 중복을 유지하려는 상황에서는 groupBy() 메서드를 사용합니다.

이 예제에서는 목록을 employee.id로 키를 포함하는 맵으로 변환했으며 값은 Map<Number, List<Employee>> ID로 그룹화된 직원 개체 목록입니다.

groupBy() 메서드는 Iterable 인터페이스의 확장 함수이기도 하며 맵에서 키로 사용되는 값만 전달하면 됩니다. 이 메서드의 keySelector 기능은 목록의 각 개체에서 키를 가져와 지도에 적용합니다.

동일한 ID를 가진 개체는 하나의 목록으로 그룹화됩니다. 이 코드를 실행하고 출력이 아래와 같은지 확인하십시오.

{1=[Employee(id=1, firstName=john, email=john@gmail.com)],
 2=[Employee(id=2, firstName=mary, email=mary@gmail.com)],
 3=[Employee(id=3, firstName=jane, email=jane@gmail.com),
    Employee(id=3, firstName=abdul, email=abdul@gmail.com)]}

결론

이 튜토리얼에서는 Iterable 인터페이스의 다양한 확장 기능을 활용하여 목록을 맵으로 변환하는 방법을 배웠습니다. 우리가 다룬 메서드에는 associate() 메서드, associateBy() 메서드, associateWith() 메서드 및 groupBy() 메서드 사용이 포함됩니다.

groupingBy()groupByTo()와 같이 사용할 수 있는 다른 그룹화 전략이 있습니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

관련 문장 - Kotlin List