fun Shop.getSetOfCustomers(): Set<Customer> = customers.toSet()
코틀린은 기본모듈에 수많은 확장함수들이 포함되어있다
그중에 toSet()이나 toList()로 즉각 컬렉션을 변경해 날갈 수 있는데
위 코드는 Shop의 확장함수로서 List 컬렉션을 고유한 개별 목록인 Set으로 전환하여 리턴하는 코드이다
확장함수는 클래스 내에 선언하는 것이 아닌 클래스 외부에서 클래스를 통해 실행될 수 있는 함수를 IoC 로 매핑하는 로직이다
sort()나 sortedDescending은 클래스 자체에 Comparable 인터페이스가 있으면 sorted나 sortedDescending로 바로 정렬할 수 있고 만약 없다면 sortedBy에 추가 파라미터를 넣어 정렬할 대상을 선택가능
fun Shop.getCustomersSortedByOrders(): List<Customer> = customers.sortedByDescending { it.orders.size }
이전 자바에서는 필터나 맵이 스트림에서만 가능했지만 코틀린에서는 Itrable 객체에 모두 사용이 가능
// Find all the different cities the customers are from
fun Shop.getCustomerCities(): Set<City> = customers.map { it.city }.toSet()
// Find the customers living in a given city
fun Shop.getCustomersFrom(city: City): List<Customer> = customers.filter { it.city == city }
All은 모두 만족일떄 참
Any는 하나라도 만족하면 참
Count는 조건에 맞는 갯수 리턴
Find는 조건에 맞는 먼저 오는 객체 리턴 없으면 Null
// Return true if all customers are from a given city
fun Shop.checkAllCustomersAreFrom(city: City): Boolean = customers.all { it.city == city }
// Return true if there is at least one customer from a given city
fun Shop.hasCustomerFrom(city: City): Boolean = customers.any { it.city == city }
// Return the number of customers from a given city
fun Shop.countCustomersFrom(city: City): Int = customers.count { it.city == city }
// Return a customer who lives in a given city, or null if there is none
fun Shop.findCustomerFrom(city: City): Customer? = customers.find { it.city == city }
Iterable 객체를 Map형태의 컬렉션으로 전환 (사실 맵은 컬렉션의 객체는 아니다)