From Java To Kotlin
From Java To Kotlin - Your Cheat Sheet For Java To Kotlin
About me
Hi, I am Amit Shekhar, I have mentored many developers, and their efforts landed them high-paying tech jobs, helped many tech companies in solving their unique problems, and created many open-source libraries being used by top companies. I am passionate about sharing knowledge through open-source, blogs, and videos.
You can connect with me on:
amitshekhar.me
Get Mentorship:Print to Console
Java
System.out.print("Amit Shekhar");
System.out.println("Amit Shekhar");
Kotlin
print("Amit Shekhar")
println("Amit Shekhar")
Constants and Variables
Java
String name = "Amit Shekhar";
final String name = "Amit Shekhar";
Kotlin
var name = "Amit Shekhar"
val name = "Amit Shekhar"
Assigning the null value
Java
String otherName;
otherName = null;
Kotlin
var otherName : String?
otherName = null
Verify if value is null
Java
if (text != null) {
int length = text.length();
}
Kotlin
text?.let {
val length = text.length
}
// or simply
val length = text?.length
Verify if value is NotNull OR NotEmpty
Java
String sampleString = "Shekhar";
if (!sampleString.isEmpty()) {
myTextView.setText(sampleString);
}
if(sampleString!=null && !sampleString.isEmpty()){
myTextView.setText(sampleString);
}
Kotlin
var sampleString ="Shekhar"
if(sampleString.isNotEmpty()){ //the feature of kotlin extension function
myTextView.text=sampleString
}
if(!sampleString.isNullOrEmpty()){
myTextView.text=sampleString
}
Concatenation of strings
Java
String firstName = "Amit";
String lastName = "Shekhar";
String message = "My name is: " + firstName + " " + lastName;
Kotlin
var firstName = "Amit"
var lastName = "Shekhar"
var message = "My name is: $firstName $lastName"
New line in string
Java
String text = "First Line\n" +
"Second Line\n" +
"Third Line";
Kotlin
val text = """
|First Line
|Second Line
|Third Line
""".trimMargin()
Substring
Java
String str = "Java to Kotlin Guide";
String substr = "";
//print java
substr = str.substring(0, 4);
System.out.println("substring = " + substr);
//print kotlin
substr = str.substring(8, 14);
System.out.println("substring = " + substr);
Kotlin
var str = "Java to Kotlin Guide"
var substr = ""
//print java
substr = str.substring(0..3) //
println("substring $substr")
//print kotlin
substr = str.substring(8..13)
println("substring $substr")
Ternary Operations
Java
String text = x > 5 ? "x > 5" : "x <= 5";
String message = null;
log(message != null ? message : "");
Kotlin
val text = if (x > 5) "x > 5" else "x <= 5"
val message: String? = null
log(message ?: "")
Bitwise Operators
Java
final int andResult = a & b;
final int orResult = a | b;
final int xorResult = a ^ b;
final int rightShift = a >> 2;
final int leftShift = a << 2;
final int unsignedRightShift = a >>> 2;
Kotlin
val andResult = a and b
val orResult = a or b
val xorResult = a xor b
val rightShift = a shr 2
val leftShift = a shl 2
val unsignedRightShift = a ushr 2
Check the type and casting
Java
if (object instanceof Car) {
Car car = (Car) object;
}
Kotlin
if (object is Car) {
var car = object as Car
}
// if object is null
var car = object as? Car // var car = object as Car?
Check the type and casting (implicit)
Java
if (object instanceof Car) {
Car car = (Car) object;
}
Kotlin
if (object is Car) {
var car = object // smart casting
}
// if object is null
if (object is Car?) {
var car = object // smart casting, car will be null
}
Multiple conditions
Java
if (score >= 0 && score <= 300) { }
Kotlin
if (score in 0..300) { }
Multiple Conditions (Switch case)
Java
int score = // some score;
String grade;
switch (score) {
case 10:
case 9:
grade = "Excellent";
break;
case 8:
case 7:
case 6:
grade = "Good";
break;
case 5:
case 4:
grade = "OK";
break;
case 3:
case 2:
case 1:
grade = "Fail";
break;
default:
grade = "Fail";
}
Kotlin
var score = // some score
var grade = when (score) {
9, 10 -> "Excellent"
in 6..8 -> "Good"
4, 5 -> "OK"
else -> "Fail"
}
For-loops
Java
for (int i = 1; i <= 10 ; i++) { }
for (int i = 1; i < 10 ; i++) { }
for (int i = 10; i >= 0 ; i--) { }
for (int i = 1; i <= 10 ; i+=2) { }
for (int i = 10; i >= 0 ; i-=2) { }
for (String item : collection) { }
for (Map.Entry<String, String> entry: map.entrySet()) { }
Kotlin
for (i in 1..10) { }
for (i in 1 until 10) { }
for (i in 10 downTo 0) { }
for (i in 1..10 step 2) { }
for (i in 10 downTo 0 step 2) { }
for (item in collection) { }
for ((key, value) in map) { }
Collections
Java
final List<Integer> listOfNumber = Arrays.asList(1, 2, 3, 4);
final Map<Integer, String> keyValue = new HashMap<Integer, String>();
map.put(1, "Amit");
map.put(2, "Anand");
map.put(3, "Messi");
// Java 9
final List<Integer> listOfNumber = List.of(1, 2, 3, 4);
final Map<Integer, String> keyValue = Map.of(1, "Amit",
2, "Anand",
3, "Messi");
Kotlin
val listOfNumber = listOf(1, 2, 3, 4)
val keyValue = mapOf(1 to "Amit",
2 to "Anand",
3 to "Messi")
for each
Java
// Java 7 and below
for (Car car : cars) {
System.out.println(car.speed);
}
// Java 8+
cars.forEach(car -> System.out.println(car.speed));
// Java 7 and below
for (Car car : cars) {
if (car.speed > 100) {
System.out.println(car.speed);
}
}
// Java 8+
cars.stream().filter(car -> car.speed > 100).forEach(car -> System.out.println(car.speed));
cars.parallelStream().filter(car -> car.speed > 100).forEach(car -> System.out.println(car.speed));
Kotlin
cars.forEach {
println(it.speed)
}
cars.filter { it.speed > 100 }
.forEach { println(it.speed)}
// kotlin 1.1+
cars.stream().filter { it.speed > 100 }.forEach { println(it.speed)}
cars.parallelStream().filter { it.speed > 100 }.forEach { println(it.speed)}
Splitting arrays
java
String[] splits = "param=car".split("=");
String param = splits[0];
String value = splits[1];
kotlin
val (param, value) = "param=car".split("=")
Defining methods
Java
void doSomething() {
// logic here
}
Kotlin
fun doSomething() {
// logic here
}
Default values for method parameters
Java
double calculateCost(int quantity, double pricePerItem) {
return pricePerItem * quantity;
}
double calculateCost(int quantity) {
// default price is 20.5
return 20.5 * quantity;
}
Kotlin
fun calculateCost(quantity: Int, pricePerItem: Double = 20.5) = quantity * pricePerItem
calculateCost(10, 25.0) // 250
calculateCost(10) // 205
Variable number of arguments
Java
void doSomething(int... numbers) {
// logic here
}
Kotlin
fun doSomething(vararg numbers: Int) {
// logic here
}
Defining methods with return
Java
int getScore() {
// logic here
return score;
}
Kotlin
fun getScore(): Int {
// logic here
return score
}
// as a single-expression function
fun getScore(): Int = score
// even simpler (type will be determined automatically)
fun getScore() = score // return-type is Int
Returning result of an operation
Java
int getScore(int value) {
// logic here
return 2 * value;
}
Kotlin
fun getScore(value: Int): Int {
// logic here
return 2 * value
}
// as a single-expression function
fun getScore(value: Int): Int = 2 * value
// even simpler (type will be determined automatically)
fun getScore(value: Int) = 2 * value // return-type is int
Constructors
Java
public class Utils {
private Utils() {
// This utility class is not publicly instantiable
}
public static int getScore(int value) {
return 2 * value;
}
}
Kotlin
class Utils private constructor() {
companion object {
fun getScore(value: Int): Int {
return 2 * value
}
}
}
// another way
object Utils {
fun getScore(value: Int): Int {
return 2 * value
}
}
Getters and Setters
Java
public class Developer {
private String name;
private int age;
public Developer(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Developer developer = (Developer) o;
if (age != developer.age) return false;
return name != null ? name.equals(developer.name) : developer.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "Developer{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Kotlin
data class Developer(var name: String, var age: Int)
Cloning or copying
Java
public class Developer implements Cloneable {
Β Β private String name;
private int age;
public Developer(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return (Developer)super.clone();
}
}
// cloning or copying
Developer dev = new Developer("Messi", 30);
try {
Developer dev2 = (Developer) dev.clone();
} catch (CloneNotSupportedException e) {
// handle exception
}
Kotlin
data class Developer(var name: String, var age: Int)
// cloning or copying
val dev = Developer("Messi", 30)
val dev2 = dev.copy()
// in case you only want to copy selected properties
val dev2 = dev.copy(age = 25)
Class methods
Java
public class Utils {
private Utils() {
// This utility class is not publicly instantiable
}
public static int triple(int value) {
return 3 * value;
}
}
int result = Utils.triple(3);
Generics
Java
// Example #1
interface SomeInterface<T> {
void doSomething(T data);
}
class SomeClass implements SomeInterface<String> {
@Override
public void doSomething(String data) {
// some logic
}
}
// Example #2
interface SomeInterface<T extends Collection<?>> {
void doSomething(T data);
}
class SomeClass implements SomeInterface<List<String>> {
@Override
public void doSomething(List<String> data) {
// some logic
}
}
interface SomeInterface<T> {
fun doSomething(data: T)
}
class SomeClass: SomeInterface<String> {
override fun doSomething(data: String) {
// some logic
}
}
interface SomeInterface<T: Collection<*>> {
fun doSomething(data: T)
}
class SomeClass: SomeInterface<List<String>> {
override fun doSomething(data: List<String>) {
// some logic
}
}
Kotlin
fun Int.triple(): Int {
return this * 3
}
var result = 3.triple()
Defining uninitialized objects
Java
Person person;
Kotlin
internal lateinit var person: Person
enum
Java
public enum Direction {
NORTH(1),
SOUTH(2),
WEST(3),
EAST(4);
int direction;
Direction(int direction) {
this.direction = direction;
}
public int getDirection() {
return direction;
}
}
Kotlin
enum class Direction(val direction: Int) {
NORTH(1),
SOUTH(2),
WEST(3),
EAST(4);
}
Sorting List
Java
List<Profile> profiles = loadProfiles(context);
Collections.sort(profiles, new Comparator<Profile>() {
@Override
public int compare(Profile profile1, Profile profile2) {
if (profile1.getAge() > profile2.getAge()) return 1;
if (profile1.getAge() < profile2.getAge()) return -1;
return 0;
}
});
Kotlin
val profile = loadProfiles(context)
profile.sortedWith(Comparator({ profile1, profile2 ->
if (profile1.age > profile2.age) return@Comparator 1
if (profile1.age < profile2.age) return@Comparator -1
return@Comparator 0
}))
Anonymous Class
Java
AsyncTask<Void, Void, Profile> task = new AsyncTask<Void, Void, Profile>() {
@Override
protected Profile doInBackground(Void... voids) {
// fetch profile from API or DB
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// do something
}
};
Kotlin
val task = object : AsyncTask<Void, Void, Profile>() {
override fun doInBackground(vararg voids: Void): Profile? {
// fetch profile from API or DB
return null
}
override fun onPreExecute() {
super.onPreExecute()
// do something
}
}
Initialization block
Java
public class User {
{ //Initialization block
System.out.println("Init block");
}
}
Kotlin
class User {
init { // Initialization block
println("Init block")
}
}
Important things to know in Kotlin
- Mastering Kotlin Coroutines - Mastering Kotlin Coroutines
- Dispatchers in Kotlin Coroutines - Dispatchers in Kotlin Coroutines
- coroutineScope vs supervisorScope - coroutineScope vs supervisorScope
- What is Flow API in Kotlin? - What is Flow API in Kotlin?
- Long-running tasks in parallel with Kotlin Flow - Long-running tasks in parallel with Kotlin Flow
- Retry Operator in Kotlin Flow - Retry Operator in Kotlin Flow
- Callback to Coroutines in Kotlin - Callback to Coroutines in Kotlin
- Retrofit with Kotlin Flow - Retrofit with Kotlin Flow
- Room Database with Kotlin Flow - Room Database with Kotlin Flow
- Remove duplicates from an array - Remove duplicates from an array in Kotlin
- JvmStatic Annotation in Kotlin - JvmStatic Annotation in Kotlin
- JvmOverloads Annotation in Kotlin - JvmOverloads Annotation in Kotlin
- JvmField Annotation in Kotlin - JvmField Annotation in Kotlin
- inline function in Kotlin - inline function in Kotlin
- noinline in Kotlin - noinline in Kotlin
- crossinline in Kotlin - crossinline in Kotlin
- lateinit vs lazy in Kotlin - lateinit vs lazy in Kotlin
- init block in Kotlin - init block in Kotlin
- Retrofit with Kotlin Coroutines - Retrofit with Kotlin Coroutines
- Advantage of using const in Kotlin - Advantage of using const in Kotlin
- AssociateBy - List to Map in Kotlin - Kotlin Collection Functions - associateBy that converts a list into a map
- partition - filtering function in Kotlin - partition - filtering function in Kotlin
- Infix notation in Kotlin - Infix notation in Kotlin
- Open keyword in Kotlin - Open keyword in Kotlin
- Companion object in Kotlin - Companion object in Kotlin
- How does the Kotlin Multiplatform work? - How does the Kotlin Multiplatform work?
amitshekhar.me
Get Mentorship:β€οΈ
Found this project useful - Support by clicking the
β button on the upper right of this page.βοΈ
License
Copyright (C) 2022 Amit Shekhar
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Contributing to From Java To Kotlin
Just make a pull request. You are in!