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   疯狂的妞妞  阅读(825)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示