Para problemas de NPE, você pode usar a maneira elegante opcional para evitar múltiplos julgamentos.
import java.util.Optional;
public class TestNPE {
public static void main(String[] args) {
TestDemo testDemo = new TestDemo();
getCount(testDemo);
}
private static void getCount(TestDemo testDemo) {
//Java8-Optional:优雅,可读性较好
int count3 = Optional.ofNullable(testDemo).map(TestDemo::getCount).orElse(1);
System.out.println(count3);
if(testDemo!=null && testDemo.getCount()!=null){
System.out.println(testDemo.getCount());
}
}
private static class TestDemo {
private Integer count;
public Integer getCount() {
return count;
}
}
}
Observe que isso é equivalente a julgar que testDemo em si não está vazio e testDemo.getCount () não está vazio.
se não ()
Quando o valor opcional não existir, chame orElse () para retornar o parâmetro de orElse () e retorne o valor opcional se o valor opcional existir
orElseGet ()
Quando o valor opcional não existe, o valor de retorno da chamada da interface em orElseGet () é chamado. Se o valor opcional existir, o valor opcional é retornado. Os exemplos são os seguintes:
import java.util.Optional;
public class Main {
public static void main(String[] args){
String nullValue = null;
String optional = Optional.ofNullable(nullValue).orElse("Su");
System.out.println(optional);
String optionalGet = Optional.ofNullable(nullValue).orElseGet(() -> "Xiao");
System.out.println(optionalGet);
String nonNullOptional = Optional.ofNullable("Susan").orElse("Su");
System.out.println(nonNullOptional);
String nonNullOptionalGet = Optional.ofNullable("Molly").orElseGet(() -> "Xiao");
System.out.println(nonNullOptionalGet);
}
}
resultado:
Su
Xiao
Susan
Molly
A diferença entre orElse () e orElseGet ()
Em primeiro lugar, vamos comparar os exemplos de uso de dois métodos em valores opcionais com e sem valores:
- Opcional tem valor:
import java.util.Arrays;
import java.util.List;
public class orElseOrElseGetComparation {
public static void main(String[] args){
List<Integer> list = Arrays.asList(23,1,3);
int myElse = list.stream().reduce(Integer::sum).orElse(get("myElse"));
int myElseGet = list.stream().reduce(Integer::sum).orElseGet(() -> get("myElseGet"));
System.out.println("myElse的值"+myElse);
System.out.println("myElseGet的值"+myElseGet);
}
public static int get(String name){
System.out.println(name+"执行了该方法");
return 1;
}
}
resultado:
myElse执行了该方法
myElse的值27
myElseGet的值27
- Quando opcional está vazio
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class orElseOrElseGetComparation {
public static void main(String[] args){
List<Integer> list = null;
List<Integer> myElse = Optional.ofNullable(list).orElse(get("myElseGet"));
List<Integer> myElseGet = Optional.ofNullable(list).orElseGet(() -> get("myElseGet"));
System.out.println("myElse的值"+myElse);
System.out.println("myElseGet的值"+myElseGet);
}
public static List<Integer> get(String name){
System.out.println(name+"执行了该方法");
List<Integer> arr = new ArrayList<>();
arr.add(1);
return arr;
}
}
resultado:
myElseGet执行了该方法
myElseGet执行了该方法
myElse的值[1]
myElseGet的值[1]
No exemplo acima de nulo e valor opcionais, você pode ver que orElse será executado independentemente de o opcional ter um valor, orElse e orElseGet serão executados quando o opcional estiver vazio. Quando o opcional não estiver vazio, orElseGet não será executado.
Link de referência:
1. https://www.jianshu.com/p/790f7c185d3e