介绍
java8之后推出了Optional用于处理一些空指针
代码
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OptionalDemo {
public void test1() {
Integer a = null;
int b = Optional.ofNullable(a).orElse(0);
List<Integer> list = null;
List<Integer> c = Optional.ofNullable(list).orElse(new ArrayList<>());
System.out.println(b);
System.out.println(c.size());
}
public void test2() {
TestClass testClass = null;
TestClass addTestClass = new TestClass();
addTestClass.setAge(10);
addTestClass.setName("addTestClass");
TestClass result = Optional.ofNullable(testClass).orElse(addTestClass);
System.out.println(result.toString());
TestClass testClass2 = new TestClass();
testClass2.setName("testClass2");
TestClass result2 = Optional.ofNullable(testClass2).orElse(addTestClass);
System.out.println(result2.toString());
}
/**
* orElse不管是不是空方法一定会调用
* orElseGet只有是空时才调用
*/
public void test3() {
Optional<String> opt = Optional.of("test");
System.out.println("orElse:");
String a = opt.orElse(getDefaultValue());
System.out.println(a);
System.out.println("orElseGet:");
String b = opt.orElseGet(() -> getDefaultValue());
System.out.println(b);
}
public String getDefaultValue() {
System.out.println("getDefaultValue do");
return "default";
}
/**
* orElse不管是不是空方法一定会调用
* orElseGet只有是空时才调用
*/
public void test4() {
System.out.println("not null");
System.out.println("orElse:");
Integer opt = 2;
int a = Optional.ofNullable(opt).orElse(getDefaultValue2());
System.out.println(a);
System.out.println("orElseGet:");
int b = Optional.ofNullable(opt).orElseGet(() -> getDefaultValue2());
System.out.println(b);
System.out.println("is null");
Integer opt2 = null;
int c = Optional.ofNullable(opt2).orElse(getDefaultValue2());
System.out.println(c);
System.out.println("orElseGet:");
int d = Optional.ofNullable(opt2).orElseGet(() -> getDefaultValue2());
System.out.println(d);
}
/**
* Optional 的链式函数式编程
* filter()过滤
* map()收集
* flatMap()收集,但是返回值要为Optional<?>形式
*/
public void test5() {
TestClass testClass = null;
TestClass testClass2 = new TestClass();
testClass2.setName("testClass2");
testClass2.setAge(100);
Optional<TestClass> opt = Optional.ofNullable(testClass);
System.out.println("ofNullable:");
System.out.println(opt.isPresent());
TestClass opt2 = Optional.ofNullable(testClass).orElse(new TestClass());
System.out.println(opt2 == null);
System.out.println("map:");
String name = Optional.ofNullable(testClass).map(t -> t.getName()).orElse("defaultName");
System.out.println(name);
String name1 = Optional.ofNullable(testClass2).map(t -> t.getName()).orElse("defaultName");
System.out.println(name1);
System.out.println("filter:");
Optional<TestClass> result1 = Optional.ofNullable(testClass2)
.filter(t -> t.getName() != null && t.name.equals("testClass2"));
System.out.println(result1.isPresent());
System.out.println(result1.orElse(new TestClass()).toString());
Optional<TestClass> result2 = Optional.ofNullable(testClass2)
.filter(t -> t.getName() != null && t.name.equals("error"));
System.out.println(result2.isPresent());
System.out.println(result2.orElse(new TestClass()).toString());
System.out.println("flatMap:");
String realName = Optional.ofNullable(testClass2)
.flatMap(t -> t.getRealName()).orElse("default");
System.out.println(realName);
String realName2 = Optional.ofNullable(testClass)
.flatMap(t -> t.getRealName()).orElse("default");
System.out.println(realName2);
}
public Integer getDefaultValue2() {
System.out.println("getDefaultValue2 do");
return 1;
}
public static void main(String[] args) {
OptionalDemo optionalDemo = new OptionalDemo();
optionalDemo.test1();
optionalDemo.test2();
optionalDemo.test3();
optionalDemo.test4();
optionalDemo.test5();
}
public class TestClass {
private Integer age;
private String name;
public Optional<String> getRealName() {
return Optional.ofNullable(name);
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "TestClass{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
}