lambda - optional
Optional 的优势是:更友好的代码展现方式。
如果想追求极致的代码性能,Optional 显然不是优选,增加了额外的对象创建过程,这是有性能损耗的。
缺点就是容易被滥用,觉得新技术牛逼,强行附和,并没有体现出优势,反而让代码更加难以理解。
使用场景
以下面代码为例,像这样一堆互相嵌套的对象,该如何优雅地取出值。
public class Test {
public Integer getAge(C c){
if(c != null){
B b = c.getB();
if (b != null){
return b.getAge();
}
}
return null;
}
}
使用 Optional 优化
使用 Optional 优化之后,让这一整段操作,形成一个逻辑整体,并且以链式的方式呈现。
- 直观地告诉观众,这一堆东西里头,都有可能是 null;
- 代码的呈现方式,发生了改变,更易于阅读。
还有一个隐藏的好处,就是 Optional 本身不会是 null,对于代码封装来说,提供了一种新的可能。
/**
* @author Mr.css
* @version 2022-08-03 16:36
*/
public class Test {
public static void main(String[] args) {
{
C c = new C();
B b = new B();
c.setB(b);
b.setAge(3);
Integer ret = Optional.ofNullable(c)
.flatMap(e -> Optional.ofNullable(e.getB()))
.flatMap(e -> Optional.ofNullable(e.getAge()))
.orElse(-1);
System.out.println(ret);
}
{
C c = new C();
B b = new B();
c.setB(b);
b.setAge(3);
Integer ret = Optional.ofNullable(c)
.flatMap(e -> Optional.ofNullable(e.getB()))
.map(B::getAge)
.orElseThrow(() -> new NullPointerException("age is required!"));
System.out.println(ret);
}
}
}
class A {
private String name;
// 省略 getter/setter
}
class B extends A {
private Integer age;
// 省略 getter/setter
}
class C{
private B b;
// 省略 getter/setter
}
flatMap 与 map 函数的区别
只是看我们的代码,不自己写的话,可能会问 flatMap 与 map 函数的区别。
其实这俩函数,只是名称接近,作用类似。返回值完全不同,互相替代是会直接报错的。
反例
代码容易被滥用,比如:
public class Test {
public void set(C c){
// 使用 of() 函数判空
// 很明显,这一行代码有用,如果 c 为 null,直接报错,终止程序运行;
// 但是很明显,有更好的工具可用,Optional 不应该这么用。
Optional.of(c);
// TODO: others
}
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!