美文网首页
java-java8新特性之optional

java-java8新特性之optional

作者: 一个喜欢烧砖的人 | 来源:发表于2018-08-20 14:24 被阅读5次

    从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)

            Optional<Object> empty = Optional.of(null);   
    //Exception in thread "main" java.lang.NullPointerException
            Optional<Object> empty = Optional.empty(); 
     //Exception in thread "main" java.util.NoSuchElementException: No value present
            Optional<Object> empty = Optional.ofNullable(null); 
    //Exception in thread "main" java.util.NoSuchElementException: No value present
            Object o = empty.get();
            System.out.println(o);
    

    下面通过几个小示例来说明基本用法

    • 判断是否为null
            String name = "fsdfds";
            Optional<String> optional = Optional.ofNullable(name);
            System.out.println(optional.isPresent());//判断是否不为null 不为空ture
            System.out.println(optional.get()); //fsdfds
    
    • 通过ifpresent判断是否执行
            String name = "fsdfds";
            Optional<String> optional = Optional.ofNullable(name);//如果不为null 才会执行下面操作
            optional.ifPresent(new Consumer<String>() {
                @Override
                public void accept(String s) {
                    System.out.println(s);
                }
            });
    
    • orElse来设置默认值(如果是空则是默认值,如果不为空是设置值)
            String s1 = null;
            String s2 = "sss";
            String ss = Optional.ofNullable(s1).orElse(s2);
            System.out.println(ss);//sss
    
    • 表面看来和orElse是一样的,其实内部实现是不同的,orelse 每次都创建,而orelseGet只创建一次
            String s1 = null;
            String s2 = "sss";
            String ss = Optional.ofNullable(s1).orElseGet(new Supplier<String>() {
                @Override
                public String get() {
                    return "www";
                }
            });
            System.out.println(ss);
    
    • map 转化
            String s = "sss";
    
            Optional<String> ss = Optional.ofNullable(s).map(new Function<String, String>() {
                @Override
                public String apply(String s) {
                    return s+"123";
                }
            });
    
            System.out.println(ss.get());  // sss123
    
    • flatMap转化
       String s = "sss";
            Optional<String> ss = Optional.ofNullable(s).flatMap(new Function<String, Optional<String>>() {
                @Override
                public Optional<String> apply(String s) {
                    return Optional.ofNullable(s+"123");
                }
            });
            System.out.println(ss.get());  // sss123
    
    • filter过滤
            String s = "sss";
            Optional<String> ss = Optional.ofNullable(s).filter(new Predicate<String>() {
                @Override
                public boolean test(String s) {
                    return true;      //true 有值 false 无值
                }
            });
            System.out.println(ss.get());
    

    总结:(因为笔者在学习optionnal之前用过rxjava和spark,所以对这种链式调用以及map,flatmap 这个并不陌生,如果你相对比较陌生,请阅读其他文档

    • Optional 是 Java 语言的有益补充 —— 它旨在减少代码中的NullPointerExceptions,虽然还不能完全消除这些异常。
    • 它也是精心设计,自然融入 Java 8 函数式支持的功能。
    • 总的来说,这个简单而强大的类有助于创建简单、可读性更强、比对应程序错误更少的程序。

    相关文章

      网友评论

          本文标题:java-java8新特性之optional

          本文链接:https://www.haomeiwen.com/subject/azfliftx.html