The Kotlin Koans tutorial continues with more demonstrations about the extensions on collection classes. This portion of the tutorial was a partitioning problem where I had to return the customers that have not had their orders delivered. Here is the code.
fun Shop.getCustomersWithMoreUndeliveredOrdersThanDelivered(): Set { // Return customers who have more undelivered orders than delivered return customers.partition { it.orders.all { it.isDelivered } }.second.toSet() }
Kotlin adds a partition method to it’s collection classes. The partition method takes a lambda expression that returns a boolean. Inside of this lambda, I used the all (#TODO Link to All) method on the orders collection. Once again, I am returning a boolean value.
Now for the coolest part. Kotlin has a pair class that has a first and second method. Since I need the orders that are not delievered, I use the second property on the Pair class. At this point, second is holding a collection of Customers whose orders are not delivered. Finally, I can use the toSet (#TODO Link) method to transform the collection into a set.
Like the last few portions of this tutorial, I decided to compare the Kotlin code to the Java 8 code. Here is what I came up with.
public static Set getCustomersWithMoreUndeliveredOrdersThanDelivered(Shop shop){ return new HashSet(shop.getCustomers() .stream() .collect(Collectors.partitioningBy((Customer c) -> c.getOrders().stream().allMatch(Order::isDelivered))) .get(false)); }
You can click here to see Part 20.