精华内容
下载资源
问答
  • JAVA8之妙用Optional解决判断Null为空的问题

    万次阅读 多人点赞 2018-12-12 17:45:55
    JAVA8之妙用Optional解决判断Null为空的问题 引言 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有...

    引言

    在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示

    o_optional1.png

    在这种情况下,有如下代码

    user.getAddress().getProvince();

    这种写法,在user为null时,是有可能报NullPointerException异常的。为了解决这个问题,于是采用下面的写法

    if(user!=null){
        Address address = user.getAddress();
        if(address!=null){
            String province = address.getProvince();
        }
    }

    这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明

    API介绍

    先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。

    1、Optional(T value),empty(),of(T value),ofNullable(T value)

    这四个函数之间具有相关性,因此放在一组进行记忆。

    先说明一下,Optional(T value),即构造函数,它是private权限的,不能由外部调用的。其余三个函数是public权限,供我们所调用。那么,Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空。好吧,这么说还是比较抽象。直接上Optional(T value)构造函数的源码,如下图所示

    o_optional2png.png

    那么,of(T value)的源码如下

    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

    也就是说of(T value)函数内部调用了构造函数。根据构造函数的源码我们可以得出两个结论:

    • 通过of(T value)函数所构造出的Optional对象,当Value值为空时,依然会报NullPointerException。

    • 通过of(T value)函数所构造出的Optional对象,当Value值不为空时,能正常构造Optional对象。

    除此之外呢,Optional类内部还维护一个value为null的对象,大概就是长下面这样的

    public final class Optional<T> {
        //省略....
        private static final Optional<?> EMPTY = new Optional<>();
        private Optional() {
            this.value = null;
        }
        //省略...
        public static<T> Optional<T> empty() {
            @SuppressWarnings("unchecked")
            Optional<T> t = (Optional<T>) EMPTY;
            return t;
        }
    }

    那么,empty()的作用就是返回EMPTY对象。

    好了铺垫了这么多,可以说ofNullable(T value)的作用了,上源码

     public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

    好吧,大家应该都看得懂什么意思了。相比较of(T value)的区别就是,当value值为null时,of(T value)会报NullPointerException异常;ofNullable(T value)不会throw Exception,ofNullable(T value)直接返回一个EMPTY对象。

    那是不是意味着,我们在项目中只用ofNullable函数而不用of函数呢?

    不是的,一个东西存在那么自然有存在的价值。当我们在运行过程中,不想隐藏NullPointerException。而是要立即报告,这种情况下就用Of函数。但是不得不承认,这样的场景真的很少。博主也仅在写junit测试用例中用到过此函数。

    2、orElse(T other),orElseGet(Supplier<? extends T> other)和orElseThrow(Supplier<? extends X> exceptionSupplier)

    这三个函数放一组进行记忆,都是在构造函数传入的value值为null时,进行调用的。orElseorElseGet的用法如下所示,相当于value值为null时,给予一个默认值:

    @Test
    public void test() {
        User user = null;
        user = Optional.ofNullable(user).orElse(createUser());
        user = Optional.ofNullable(user).orElseGet(() -> createUser());
        
    }
    public User createUser(){
        User user = new User();
        user.setName("zhangsan");
        return user;
    }

    这两个函数的区别:当user值不为null时,orElse函数依然会执行createUser()方法,而orElseGet函数并不会执行createUser()方法,大家可自行测试。

    至于orElseThrow,就是value值为null时,直接抛一个异常出去,用法如下所示

    User user = null;
    Optional.ofNullable(user).orElseThrow(()->new Exception("用户不存在"));

    3、map(Function<? super T, ? extends U> mapper)和flatMap(Function<? super T, Optional<U>> mapper)

    这两个函数放在一组记忆,这两个函数做的是转换值的操作。

    直接上源码

     public final class Optional<T> {
        //省略....
         public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
            Objects.requireNonNull(mapper);
            if (!isPresent())
                return empty();
            else {
                return Optional.ofNullable(mapper.apply(value));
            }
        }
        //省略...
         public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
            Objects.requireNonNull(mapper);
            if (!isPresent())
                return empty();
            else {
                return Objects.requireNonNull(mapper.apply(value));
            }
        }
    }

    这两个函数,在函数体上没什么区别。唯一区别的就是入参,map函数所接受的入参类型为Function<? super T, ? extends U>,而flapMap的入参类型为Function<? super T, Optional<U>>

    在具体用法上,对于map而言:

    如果User结构是下面这样的

    public class User {
        private String name;
        public String getName() {
            return name;
        }
    }

    这时候取name的写法如下所示

    String city = Optional.ofNullable(user).map(u-> u.getName()).get();

    对于flatMap而言:

    如果User结构是下面这样的

    public class User {
        private String name;
        public Optional<String> getName() {
            return Optional.ofNullable(name);
        }
    }

    这时候取name的写法如下所示

    String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();

    4、isPresent()和ifPresent(Consumer<? super T> consumer)

    这两个函数放在一起记忆,isPresent即判断value值是否为空,而ifPresent就是在value值不为空时,做一些操作。这两个函数的源码如下

    public final class Optional<T> {
        //省略....
        public boolean isPresent() {
            return value != null;
        }
        //省略...
        public void ifPresent(Consumer<? super T> consumer) {
            if (value != null)
                consumer.accept(value);
        }
    }

    需要额外说明的是,大家千万不要把

    if (user != null){
       // TODO: do something
    }

    给写成

    User user = Optional.ofNullable(user);
    if (Optional.isPresent()){
       // TODO: do something
    }

    因为这样写,代码结构依然丑陋。博主会在后面给出正确写法

    至于ifPresent(Consumer<? super T> consumer),用法也很简单,如下所示

    Optional.ofNullable(user).ifPresent(u->{
        // TODO: do something
    });

    5、filter(Predicate<? super T> predicate)

    不多说,直接上源码

    public final class Optional<T> {
        //省略....
       Objects.requireNonNull(predicate);
            if (!isPresent())
                return this;
            else
                return predicate.test(value) ? this : empty();
    }

    filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty

    用法如下

    Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);

    如上所示,如果user的name的长度是小于6的,则返回。如果是大于6的,则返回一个EMPTY对象。

    实战使用

    例一

    在函数方法中

    以前写法

    public String getCity(User user)  throws Exception{
            if(user!=null){
                if(user.getAddress()!=null){
                    Address address = user.getAddress();
                    if(address.getCity()!=null){
                        return address.getCity();
                    }
                }
            }
            throw new Excpetion("取值错误"); 
        }

    JAVA8写法

    public String getCity(User user) throws Exception{
        return Optional.ofNullable(user)
                       .map(u-> u.getAddress())
                       .map(a->a.getCity())
                       .orElseThrow(()->new Exception("取指错误"));
    }

    例二

    比如,在主程序中

    以前写法

    if(user!=null){
        dosomething(user);
    }

    JAVA8写法

     Optional.ofNullable(user)
        .ifPresent(u->{
            dosomething(u);
    });

    例三

    以前写法

    public User getUser(User user) throws Exception{
        if(user!=null){
            String name = user.getName();
            if("zhangsan".equals(name)){
                return user;
            }
        }else{
            user = new User();
            user.setName("zhangsan");
            return user;
        }
    }

    java8写法

    public User getUser(User user) {
        return Optional.ofNullable(user)
                       .filter(u->"zhangsan".equals(u.getName()))
                       .orElseGet(()-> {
                            User user1 = new User();
                            user1.setName("zhangsan");
                            return user1;
                       });
    }

    其他的例子,不一一列举了。不过采用这种链式编程,虽然代码优雅了。但是,逻辑性没那么明显,可读性有所降低,大家项目中看情况酌情使用。

    展开全文
  • java数组长度为0和数组为null

    千次阅读 2017-04-20 19:38:38
    //zero引用一个长度为0的数组对象为null的数组,能求数组长度,且求解时会出现空指针异常NullPointerException。int[] zero = null; //数组类型的空引用,指向任何对象假设一个方法返回一个数组: 如果它返回...

    长度为0的数组,可以求数组长度,为0,即数组内没有元素。

    int[] zero = new int[0];  //zero引用一个长度为0的数组对象

    为null的数组,不能求数组长度,且求解时会出现空指针异常NullPointerException。

    int[] zero = null;  //数组类型的空引用,不指向任何对象

    假设一个方法返回一个数组:
    如果它返回null,则调用方法必须先判断是否返回null,才能对返回数组进一步处理;
    如果返回空数组,则无须null引用检查。
    因此,返回数组的方法在没有结果时我们通常返回空数组,即“”,而不是null,这样做对于函数调用者的处理比较方便。

    展开全文
  • Java中数组为null 和数组长度为0的区别

    千次阅读 多人点赞 2019-03-23 16:47:06
    java中数组空和数组长度为0的区别(注意是坑) CollectionUtils工具类 https://blog.csdn.net/qq_33146717/article/details/80268688 CollectionUtils 在 import org.apache.commons.collections.CollectionUtils...

    java中数组为空和数组长度为0的区别(注意是坑) CollectionUtils工具类

    https://blog.csdn.net/qq_33146717/article/details/80268688

    CollectionUtils

    在  import org.apache.commons.collections.CollectionUtils包下面的方法

    可以直接判断数组为空 || size> 0

    两者如果在一句代码中,则要先判断是否为空,否则可能会出现空指针异常。
    eg:

    if(array == null || 0 == array.length) {...}   // 这种写法正确,因为执行到 “0 == array.length”则说明数组不为空,不会产生空指针异常。

    if (0 == array.length || array == null) {...} // 这种写法可能会产生空指针异常。
    例:

    int[] n;        //只声明了一数组变量;                              
    int[] nil = null;        //声明一数组变量,并赋值 null,nil是一个数组类型的空引用,不指向任何对象;                             
    int[] zero = new int[0];  //声明并创建一数组对象,长度是0;

    对于上面三条语句,一个比一个做的动作多,系统占用也是后面的多:
    语句一变量还没初始化,打印 n 会出错:“可能尚未初始化变量 n”;
    语句二虽已初始化,打印“nil.length”会出现异常:NullPointerException;

    语句三打印“nil.length”是0,数组内还没有元素。
           假设一个方法返回一个数组,如果它返回null,则调用方法必须先判断是否返回null,才能对放回数组进一步处理,而如果返回空数组,则无须null引用检查。鉴于此,返回数组的方法在没有结果时我们通常返回空数组,而不是null,这样做对于函数调用者的处理比较方便。


    Java中数组为空和数组长度为0的区别

    https://blog.csdn.net/u012156116/article/details/79690277

    今天在做题的时候遇到了这个问题,首先

             List<List<Integer>> results = new ArrayList<>();
             if (nums == null) {
                 return results; 
             }
             
             if (nums.length == 0) {
                results.add(new ArrayList<Integer>());
                return results;
             }

    nums是一个数组,可以看到他们的区别。

    int[] array = null; 数组为空,此时array不指向任何对象;

    int[] array = new array[0]; 定义一个长度为0的数组;

    int[] array = new array[2]; 定义一个长度为2的数组,此时如果数组没有被初始化,默认的值为null;

    一般先判断 nums 是否为空,然后再判断长度是否为0,因为可能报空指针异常。

    所以如果在一行代码中要同时判断的时候需要这样写:

    if(array == null || array.length == 0)

    因为 || 是短路或,前面的符合了后面的就不考虑了。


    【Java】返回长度为零的数组或者集合,而不是null

    https://www.cnblogs.com/yongh/p/9812596.html

     今天在牛客网上做一个编程题时,在提交代码后老是抛出NullPointerException异常,大概的代码如下:

    public ArrayList<Integer> foo(TreeNode root) {
        if (root == null)
            return null;
            ……
            ……
    }

     后来改成如下代码就通过了。

    public ArrayList<Integer> foo(TreeNode root) {
        if (root == null)
            return new ArrayList<Integer>();
            ……
            ……
    }

     具体原因应该是牛客网中的测试代码没有考虑null的情况,希望我们返回的是一个空的ArrayList。

      就返回值到底应该是用null还是空集合的问题,查了一些资料:

    《阿里巴巴JAVA开发手册》书中表示:可以返回null,因为防止NPE是调用者的责任。

    《Effective Java (Third Edition)》书中表示:返回长度为零的数组或者集合,而不是null。

    再结合一下别的博客,自己大概总结一下:

      1)返回值为null并不会有什么问题,但是在“解引用”(dereference)时,调用者没有对null进行判断就会出现NullPointerException。

      2)在返回值为数组或者集合时,尽量返回长度为零的数组或者集合,而不是null,这样在调用时就能简化代码,减少不必要的麻烦,并且不必担心NullPointer异常(除非这对性能会造成很大的影响)。

      就对自己以后编程来说,编写方法时,如果返回值是数组或者集合,就尽量返回长度为零的数组或者集合,而不是null。而自己调用方法时,还是要注意对null情况的判断。

      此外,如果返回值为空对象时没有意义的话,就可以考虑直接抛出异常。

     

     

     

     

     

     

     

     

     

    展开全文
  • Java函数重载和null参数的传递

    千次阅读 2010-12-23 18:39:00
    今天读代码发现有一行代码很奇怪: setData((Hashtable)null);... Java会根据传入的参数来判断调用的是那个方法,但是如果传入的值是null,那么就需要进行一个类型转换,来告诉Java

    今天读代码发现有一行代码很奇怪:

    setData((Hashtable)null);

    为什么要对null进行一个转型呢?仔细一研究,发现原来是函数重载引起的:

    这个类里面有2个setData方法,而且参数都只有一个,如下:

    setData(DefaultEntity e);

    setData(Hashtable e);

    Java会根据传入的参数来判断调用的是那个方法,但是如果传入的值是null,那么就需要进行一个类型转换,来告诉Java需要调动的是那个函数,否则就会引起混淆。编译器也通不过。

    也可以写成这样:

    Hashtable ht = null;

    setData(ht);

    展开全文
  • Java中长度为0的数组与null的区别

    千次阅读 2014-10-16 22:00:19
     zero是一个长度为0的数组,我们称之“空数组”,空数组也是一个对象,只是包含元素个数为0。  nil是一个数组类型的空引用。  假设一个方法返回一个数组,如果它返回null,则调用方法必须先判断是否返回...
  • java判断字符串是否数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){  for (int i = 0; i  System.out.println(str.charAt(i));  if (!Character.isDigit(str.charAt(i...
  • java 判断字符串是否空的通用函数

    千次阅读 2011-07-30 17:43:24
    public static boolean isNull(String str) { if(str == null || "".equals(str) || "null".equals(str)) { return true; } else {
  • null 与 a.length()的区别 如果a为null 则a.length就会报 java lang nullpointException 正确的处理方法: if(a==null){ } 而不是a.length>0
  • UDF函数判断日期是否月末日期?

    千次阅读 2018-04-30 17:46:37
    需求:判断一个日期是否当月月末日期?import org.apache.commons.lang.StringUtils; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.BooleanWritable; import java.text.Parse...
  • java判断是否字母

    万次阅读 2019-04-02 09:36:15
    * 判断是否整数 * @param str 传入字符串 * @return 是整数返回true,否则返回false */ public static boolean isInteger(String str){ Pattern pattern=Pattern.compile("^[-\\+]?[\\d]*$...
  • Java函数式编程详解

    万次阅读 多人点赞 2019-05-05 21:46:49
    1.Java函数式编程的语法: 使用Consumer作为示例,它是一个函数式接口,包含一个抽象方法accept,这个方法只有输入而无输出也就是说这个方法无返回值。 现在我们要定义一个Consumer接口的实例化对象,传统的方式是....
  • public static boolean isNetUrl(String url) { boolean reault = false; if (url != null) { if (url.toLowerCase().startsWith("http") || url.toLowerCase().startsWith("rtsp") || u
  • 原文地址:http://blog.csdn.net/u013066244/article/details/53197756 用JAVA自带的函数 public static boolean isNumericZidai(String str) { for (int i = 0; i (); i++) { S
  • Java 函数优雅之道

    万次阅读 多人点赞 2019-08-20 10:48:13
    本文总结了一套与Java函数相关的编码规则,旨在给广大Java程序员一些编码建议,有助于大家编写出更优雅、更高质、更高效的代码。这套编码规则,通过在高德采集部门的实践,已经取得了不错的成效。 1.使用通用工具...
  • null和”的区别与判断 null是一种类型,''是空字符串,打个比方,''是你参加了考试且得了零分,而null则是你压根就没有参加考试。 如果要在sql中对两者进行判断,是有区别的: //null只能和is或is not...
  • Java8函数接口

    千次阅读 2020-09-20 01:21:16
    Java函数编程:原始类型转换成对应的引用类型,Java中的泛型只能绑定引用类型,这由泛型内部的实现方式造成的,Java中包括一个将原始基本类型转换成引用类型的机制,成为装箱,反过程拆箱操作。IntPredicate等可以...
  • JAVA与SQL 中的nullNULL

    千次阅读 2016-10-14 22:55:54
     nullNULL不都是表示空值吗?这有什么值得深入讨论的的?首先你在编写Java代码时使用过NULL吗?大概用IDE用习惯了,自动给生成以及纠正没有注意过也很正常。同样道理在数据库中的疑问我就提问了。如果你了解...
  • 使用 ISNULL() 来判断是否 NULL

    万次阅读 2018-09-09 21:25:01
    使用 ISNULL() 来判断是否 NULL 值。 说明: NULL 与任何值的直接比较都 NULL。 1 ) NULL&lt;&gt;NULL 的返回结果是 NULL ,而不是 false 。 2 ) NULL=NULL 的返回结果是 NULL ,而不是 true 。 3 ) ...
  • Java中字符串什么以\0结尾

    千次阅读 2015-08-08 11:17:06
    其实这个问题没有什么好说的,...学过C/C++的人都有一种固定的思维模式,凡是字符串都是以\0结束,其实C++中未必,信你查查string这个泛型类,为了与C语言兼容性,它里面有一个方法c_str()就是返回以\0结束的字符串。
  • 收集资料如下判断: 1.判断undefined: var tmp = undefined; if (typeof(tmp) == "undefined"){ alert("undefined"); }说明:typeof 返回的是字符串,有六种可能:"number"、"string"、"boolean"、
  • 本文博客链接:http://blog.csdn.net/QQ1084283172/article/details/79378374在进行Android逆向分析的时候,经常需要进行动态调试栈回溯,查看Java函数的调用流程,Android的smali动态调试又不是很方便,因此使用...
  • java多线程wait时什么要用while而不是if

    千次阅读 多人点赞 2018-11-06 17:44:52
    对于java多线程的wait()方法,我们在jdk1.6的说明文档里可以看到这样一段话   从上面的截图,我们可以看出,在使用wait方法时,需要使用while循环来判断条件十分满足,而不是if,那么我们思考以下,如果使用...
  • mybatis plus 判断字段为null

    千次阅读 2020-07-30 10:50:43
    if(country != null){ if(country != 6L){ wrapper.eq("country", String.valueOf(country)); }else{ wrapper.isNull("country"); } }
  • Js中判断一个值为null

    千次阅读 2015-07-30 11:17:36
    以下是正确的方法: ...exp  undefined 时,也会得到与 null 相同的结果,虽然 null 和 undefined 一样。 注意:要同时判断 null 和 undefined 时可使用本法。   var exp = null; if (!
  • java不通过构造函数创建对象(Unsafe)

    万次阅读 多人点赞 2020-05-31 17:02:16
    java通过构造函数创建对象(也有说创建对象直接执行成员方法) 这里就和你们扯什么通过 反序列化、clone等方法了 个人觉得都是在胡扯。 如何执行构造函数创建对象? 先来带大家认识一个类 sun.misc.Unsafe...
  • java判断字符串是否数字的方法

    万次阅读 2008-08-27 14:02:00
    java判断字符串是否数字的方法: 1.用JAVA自带的函数public static boolean isNumeric(String str){ for (int i = 0; i System.out.println(str.charAt(i)); if (!Character.isDigit(str.charAt(i))){ return ...
  • java判断字符串是否数字的方法的几种方法

    万次阅读 多人点赞 2016-11-17 11:26:22
    前言 网上有很多这种资料,之所以我又写一篇,是今天在实践网上给的方法时,发现很多bug。 所以我就自己总结下。...用JAVA自带的函数 public static boolean isNumericZidai(String str) { for (int...
  • java检测集合是否空或长度是否为0

    千次阅读 2018-06-25 15:22:47
    java检测集合是否空或长度是否为0当读数据库的数据后,返回的数据可能空或长度等于0,而我们要取第一个,或其他的数据,如果这个数据空时就会报错,写了一个工具类方便调用:package com.yx.utils; import ...
  • Java判断Stack和Queue是否空的方法

    千次阅读 2019-12-23 14:54:50
    Stack stack.empty(), 为空返回...stack.size(), 为空返回0不为空返回一个大于1的整数。 Queue queue.isEmpty(), 为空返回true,不为空返回false。 queue.peek(), 为空返回null不为空返回栈顶元素。 queue.si...
  • java 判断字符串是否

    千次阅读 2019-01-17 09:34:45
    java 字符串判断为

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 295,133
精华内容 118,053
关键字:

java函数判断不为0并且不为null

java 订阅