For the seasoned Java
This is a first of this series of posts unioned by tag #kotlin-showoff
As from my experience it takes literally two days for average developer to switch to kotlin from java and start to write meaningful business logic
As time goes by code can use more kotlin specific constructions which make code much more readable and expressive. In this blog post I'd like to show off some of the nice functional constructions which help to make code more idiomatic.
Extracting data from the nullable types
Say, we have an class Address within UserInfo which holds information about the given user's address. UserInfo is a part of the Person. UserInfo can be nullalbe as well as Address but we want to extract city name. In java it would look like:
Person person;
String city;
if (person.userInfo != null && person.userInfo.address != null && person.userInfo.address.city != null)
city = person.userInfo.address.city;
else city = "Unknown city";
System.out.println("User is in " + city);
If you think it's a safe code I have citynull
The correct approach would be to capture values while we're performing the check:
UserInfo userInfo = person.userInfo;
if (userInfo != null) {
Address address = userInfo.address;
if (address != null) {
city = address.city;
}
}
if (city == null)
city = "Unknown city";
System.out.println("User is in " + city);
Expressivity is not Java best strength. But wait, with Java 8 we can make it a bit more readable (and still safe):
city = Optional.ofNullable(person.userInfo)
.map(userInfo -> userInfo.address)
.map(address -> address.city)
.orElse("Unknown city");
System.out.println("User is in " + city);
Looks better, isn't it? Wait for kotlin
println("User is in ${person.userInfo?.address?.city ?: "Unknown city"}")
Sorry java ¯\_(ツ)_/¯
So what exactly happens here? The person.userInfo?.address?.citynullnullcity
You can eat your cake, and have it too
Is it safe one might wonder? Yes, it is. Look into the generated code:
public final class KotlinImplKt {
public static final void kotlinImpl() {
StringBuilder var10000;
String var4;
label14: {
Person person = new Person();
var10000 = (new StringBuilder()).append("User is in ");
UserInfo var10001 = person.userInfo;
if (var10001 != null) {
Address var3 = var10001.address;
if (var3 != null) {
var4 = var3.city;
if (var4 != null) {
break label14;
}
}
}
var4 = "Unknown city";
}
String var1 = var10000.append(var4).toString();
boolean var2 = false;
System.out.println(var1);
}
}
Check out other posts in #kotlin-showoff
