Skip to content

Instantly share code, notes, and snippets.

@khannedy
Created May 15, 2018 11:14
Show Gist options
  • Save khannedy/b50585f61641041cc2e9e011068655c5 to your computer and use it in GitHub Desktop.
Save khannedy/b50585f61641041cc2e9e011068655c5 to your computer and use it in GitHub Desktop.
package com.gdn.rnd.codingguideline;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;
import java.util.Optional;
/**
* @author Eko Kurniawan Khannedy
*/
public class OptionalTest {
private Customer customer;
@Test
public void nameUsingIf() {
String name = customer.getName();
if (name == null) {
name = "";
}
System.out.println(name);
}
@Test
public void nameUsingOptional() {
String name = Optional.ofNullable(customer.getName())
.orElse("");
System.out.println(name);
}
@Test
public void dbLogicUsingIf() {
Customer user = findCustomerById("id");
if (user == null) {
user = createNewUser("id");
}
System.out.println(user);
}
@Test
public void dbLogicUsingOptional() {
Customer user = Optional.ofNullable(findCustomerById("id"))
.orElse(createNewUser("id"));
System.out.println(user);
}
@Test
public void nameUpperCaseUsingIf() {
String nameUpper = customer.getName();
if (nameUpper != null) {
nameUpper = nameUpper.toUpperCase();
} else {
nameUpper = "";
}
System.out.println(nameUpper);
}
@Test
public void nameUpperUsingOptional() {
String nameUpper = Optional.ofNullable(customer.getName())
.map(String::toUpperCase)
.orElse("");
System.out.println(nameUpper);
}
@Test
public void countryUsingIf() {
String country = "Indonesia";
if (customer.getAddress() != null) {
if (customer.getAddress().getCountry() != null) {
country = customer.getAddress().getCountry();
}
}
System.out.println(country);
}
@Test
public void countryUsingOption() {
String country = Optional.ofNullable(customer.getAddress())
.map(Customer.Address::getCountry)
.orElse("Indonesia");
System.out.println(country);
}
@Test
public void nameExceptionUsingIf() {
String name = customer.getName();
if (name == null) {
throw new IllegalArgumentException("Name is null");
}
System.out.println(name);
}
@Test
public void nameExceptionUsingOption() {
String name = Optional.ofNullable(customer.getName())
.orElseThrow(() -> new IllegalArgumentException("Name is null"));
System.out.println(name);
}
@Test
public void countryDoSomeThingUsingIf() {
if (customer.getAddress() != null) {
if (customer.getAddress().getCountry() != null) {
// do something
System.out.println(customer.getAddress().getCountry());
}
}
}
@Test
public void countryDoSomethingUsingOption() {
Optional.ofNullable(customer.getAddress())
.map(Customer.Address::getCountry)
.ifPresent(country -> {
// do something
System.out.println(customer.getAddress().getCountry());
});
}
@Test
public void nestedObjectUsingIf() {
Long cashBalance = 0L;
if (customer.getWallet() != null) {
if (customer.getWallet().getBalance() != null) {
cashBalance = customer.getWallet().getBalance().getCashBalance();
}
}
System.out.println(cashBalance);
}
@Test
public void nestedObjectUsingOption() {
Long cashBalance = Optional.ofNullable(customer.getWallet())
.map(Customer.Wallet::getBalance)
.map(Customer.WalletBalance::getCashBalance)
.orElse(0L);
System.out.println(cashBalance);
}
@Test
public void filterWithIf() {
Long bonus = 0L;
if (Customer.Type.PREMIUM.equals(customer.getType())) {
if (customer.getWallet() != null) {
if (customer.getWallet().getBalance() != null) {
bonus = customer.getWallet().getBalance().getCashBalance() * 10 / 100;
}
}
}
System.out.println(bonus);
}
@Test
public void filterWithOptional() {
Long bonus = Optional.of(customer)
.filter(value -> Customer.Type.PREMIUM.equals(value.getType()))
.map(Customer::getWallet)
.map(Customer.Wallet::getBalance)
.map(balance -> balance.getCashBalance() * 10 / 100)
.orElse(0L);
System.out.println(bonus);
}
private Customer createNewUser(String id) {
return null;
}
private Customer findCustomerById(String id) {
return null;
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class Customer {
private String name;
private Address address;
private Wallet wallet;
private Type type;
public static enum Type {
GOLD, PREMIUM, CLASSIC
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class Address {
private String street;
private String city;
private String country;
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class Wallet {
private Long totalBalance;
private WalletBalance balance;
}
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class WalletBalance {
private Long refundBalance;
private Long nonCashBalance;
private Long cashBalance;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment