Earyant的技术博客

欢迎来到Earyant的技术博客,在这里我将与你分享新技术。

Guava 1.1基本工具

1.1-使用和避免null

map允许null作为键,但只能有一个。
concurrentHashMap不允许null作为键。

Optional

1
2
3
Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

静态创建方法

  • of
  • ofNullable
  • empty

    实例方法

  • isPresent
  • get
  • or (jdk中是orElse)
  • orNull
  • asSet

意义:
使用Optional除了赋予null语义,增加了可读性,最大的优点在于它是一种傻瓜式的防护。Optional迫使你积极思考引用缺失的情况,因为你必须显式地从Optional获取引用。直接使用null很容易让人忘掉某些情形,尽管FindBugs可以帮助查找null相关的问题,但是我们还是认为它并不能准确地定位问题根源。
如同输入参数,方法的返回值也可能是null。和其他人一样,你绝对很可能会忘记别人写的方法method(a,b)会返回一个null,就好像当你实现method(a,b)时,也很可能忘记输入参数a可以为null。将方法的返回类型指定为Optional,也可以迫使调用者思考返回的引用缺失的情形。

使用方式:

  • 错误的使用方式:
    1
    2
    3
    4
    5
    6
    Optional<User> user = Optional.ofNullable(user);
    if (user.isPresent()) {
    int sex = user.getSex();
    // 链式调用,最容易出现空指针
    int age = user.getParent().getParent().getParent().getAge();
    }
  • 正确的使用方式
    1
    2
    3
    Optional<User> user = Optional.ofNullable(user);
    int sex = user.map(User::getSex).orElse(0);
    int age = user.map(User::getParent).map(User::getParent).map(User::getParent).map(User::getAge).orElse(0);

其他处理null的便利方法

  • Objects.firstNonNull(T, T)
  • Objects还有其它一些方法专门处理null或空字符串:emptyToNull(String),nullToEmpty(String),isNullOrEmpty(String)。

1.2-前置条件 Preconditions

— — —
方法声明(不包括额外参数) 描述 检查失败时抛出的异常
checkArgument(boolean) 检查boolean是否为true,用来检查传递给方法的参数。 IllegalArgumentException
checkNotNull(T) 检查value是否为null,该方法直接返回value,因此可以内嵌使用checkNotNull。 NullPointerException
checkState(boolean) 用来检查对象的某些状态。 IllegalStateException
checkElementIndex(int index, int size) 检查index作为索引值对某个列表、字符串或数组是否有效 IndexOutOfBoundsException
checkPositionIndex(int index, int size) 检查index作为位置值对某个列表、字符串或数组是否有效。 IndexOutOfBoundsException
checkPositionIndexes(int start, int end, int size) 检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效* IndexOutOfBoundsException

参考

欢迎关注我的其它发布渠道