java8 Optional类与接口默认方法
Optional
Optional<T> (java.util.Optional)类是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常.
Optional.of(T t):创建一个实例
Optional.empty():创建一个空的Optional实例
Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空例
isPresent():判断是否包含值
orElse(T t):如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s):如果调用对象包含值,否则返回s获取的值
map(Function f):如果有值进对其处理,并返回处理后的Optional,否则返回Optional.empty()
flatMap(Function mapper):与map类似,要求返回值必须是Optional
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
class User {
private String name="小王";
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
private int score=90;
private int age=1;
public User() {
}
public User(int score, int age, String name) {
super();
this.score = score;
this.age = age;
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", score=" + score +
", age=" + age +
'}';
}
static List<User> list = Arrays.asList(
new User(1, 2, "张三"),
new User(2, 4, "李四"),
new User(3, 6, "王五"),
new User(3, 90, "赵六"),
new User(3, 90, "小黑")
);
public static void main(String[] args) {
//如果传入null会报空指针异常
Optional<User> user = Optional.of(new User());
User user1 = user.get();
System.out.println(user1);//User{name='小王', score=90, age=1}
Optional<User>op=Optional.empty();
// System.out.println(op.get());如果设置为空的话,get的时候会报错
//如果为null调用of,否则调用of
Optional<User>op2=Optional.ofNullable(null);
if (op2.isPresent()){
System.out.println(op2.get());//如果有值就取值并打印,这里不会执行
}
//如果op2中没有值,就创建一个传入的新值,赋值给op3
User op3 = op2.orElse(new User(1, 2, "新"));
System.out.println(op3);//User{name='新', score=1, age=2}
//函数式接口,可以用lambda表达式实现自己想要的功能
op2.orElseGet(()->new User());
Optional<User> op4=Optional.ofNullable(new User(1, 2, "新2"));
Optional<String> s = op4.map((e) -> e.getName());
System.out.println(s.get());//新2
Optional<String> s1 = op4.flatMap((e) -> Optional.of(e.getName()));
System.out.println(s1.get());//新2
}
}
接口新特性
接口改动一下就要修改对应的实现类,为了兼容老接口,Java8新增了默认方法和静态方法;
1)静态方法可以直接调用,不能被重写
2)默认方法需要通过实现类,重写后实例化后调用
接口默认方法的类优先原则
若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时
- 选择父类中的方法.如果一父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略
- 接口冲突,如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管是否是默认方法),那么必须覆盖该方法来解决冲突