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
    }

posted on 2019-09-28 18:50  疯狂的妞妞  阅读(821)  评论(0编辑  收藏  举报

导航