Optional<T>的优秀实践

实践1. Lambda配合Optional<T>可以使Java对于null的处理变的异常优雅

这里假设我们有一个person 对象,以及一个personobject的Optional wrapper:

person 对象和判空wrapper

错误实践: Optional<T>如果不结合Lambda使用的话,并不能使原来繁琐的null check变的简单。

鸡肋的Optional用法

正确姿势: 只有当Optional<T>结合Lambda一起使用的时候,才能发挥出其真正的威力!

我们现在就来对比一下下面四种常见的null处理中,Java 8的Lambda+Optional<T>和传统Java两者之间对于null的处理差异。

1. 情况一 - 存在则开干
存在并直接处理
2. 情况二 - 存在则返回,无则返回标记
用于返回
3. 情况三 - 存在则返回,无则由函数产生
存在则返回,无则由函数产生
4. 情况四 - 夺命连环null检查
夺命连环null检查

由上述四种情况可以清楚地看到,Optional<T>+Lambda 可以让我们少写很多ifElse块。尤其是对于情况四那种夺命连环null检查,传统java的写法显得冗长难懂,而新的Optional<T>+Lambda则清新脱俗,清楚简洁。

举个栗子

定义一个列表,并使用其stream和Option功能

public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(2);
        list.add(4);
        list.add(5);
        list.add(1);
        list.add(20);

        // 1. 选出list中的最小值
        Stream<Integer> streams = list.stream();
        Optional<Integer> minOptional = streams.min(Integer::compareTo);
        minOptional.ifPresent(min -> log.info("最小值-{}", min));
        streams.close();

        // 2. 选出最大值
        Stream<Integer> stream = list.stream();
        Optional<Integer> maxOptional = stream.max(Integer::compareTo);
        maxOptional.ifPresent(max -> log.info("最大值-{}", max));
        stream.close();

        // 3. 如果有值就返回,否则就返回一个标记
        Stream<Integer> stream2 = list.stream();
        Optional<Integer> existedOptional = stream2.filter(elem -> elem > 100)
                .max(Integer::compareTo);
        int result = existedOptional.orElse(-1000);
        log.info("过滤结果:{}", result);
        stream2.close();
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容