`
sungang_1120
  • 浏览: 321550 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Guava API学习之Optional 判断对象是否为null

阅读更多

 

java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了。为了防止抛出这个异常,我们经常会写出这样的代码:

Person person = people.find("John Smith");
if (person != null) {
 person.doSomething();
}

 

 在Java世界里,解决空引用问题常见的一种办法是,使用Null Object模式。这样的话,在“没有什么”的情况下,就返回Null Object,客户端代码就不用判断是否为空了。但是,这种做法也有一些问题。首先,我们肯定要为Null Object编写代码,而且,如果我们想大规模应用这个模式,我们要为几乎每个类编写Null Object。

 

幸好,我们还有另外一种选择:Optional。Optional是对可以为空的对象进行的封装,它实现起来并不复杂。在某些语言里,比如 Scala,Optional实现成了语言的一部分。而对于Java程序员而言,Guava为我们提供了Optional的支持。闲言少叙,先来如何使用 Optional,完成前面的那段代码

Optional person = people.find("John Smith");
if (person.isPresent()) {
 person.get().doSomething();
}

 

这里如果isPresent()返回false,说明这是个空对象,否则,我们就可以把其中的内容取出来做自己想做的操作了。

如果你期待的是代码量的减少,恐怕这里要让你失望了。单从代码量上来说,Optional甚至比原来的代码还多。但好处在于,你绝对不会忘记判空,因为这里我们得到的不是Person类的对象,而是Optional。

看完了客户端代码,我们再来看看怎样创建一个Optional对象,基本的规则很简单:

如果我们知道自己要封装的对象是一个空对象,可以用

 Optional.absent();

如果封装的对象是一个非空对象,则可以用

 Optional.of(obj);

如果不知道对象是否为空,就这样创建创建

 Optional.fromNullable(obj);

有时候,当一个对象为null的时候,我们并不是简单的忽略,而是给出一个缺省值,比如找不到这个人,任务就交给经理来做。使用Optional可以很容易地做到这一点,以上面的代码为例:

  Optional person = people.find("John Smith");
  person.or(manager).doSomething()

说白了,Optinal是给了我们一个更有意义的“空”。

 

简单使用实例:

Student student = new Student();
		String name = student.getName();
		Optional<String> optional = Optional.fromNullable(name);
		if (optional.isPresent()) {
			System.out.println("name : " + name);
		}else {
			System.out.println("null ........");
			student.setName("sungang");
		}
		
		name = student.getName();
		optional = Optional.fromNullable(name);
		if (optional.isPresent()) {
			System.out.println("name : " + name);
		}else {
			System.out.println("null ........");
			student.setName("sungang");
}

 

结果:

null ........
name : sungang

 

分享到:
评论

相关推荐

    guava-21.0-rc2 、guava-21.0-rc2-javadoc 、guava-21.0-rc2-sources

    - **错误处理**: 引入了`Optional`类,帮助开发者更好地处理null值问题,减少空指针异常的发生。 总的来说,Guava库是Java开发者的强大工具,它提供的各种工具和类库能帮助开发者编写更高效、更健壮的代码。无论是...

    Google Guava 30.1.1常用类介绍及实践代码

    - `Optional` 类是一个容器对象,可能包含或不包含非null值。如果值存在则 `isPresent()` 返回 true,调用 `get()` 返回该值。这样可以避免空指针异常,提高代码的健壮性。 ```java Optional&lt;String&gt; optionalName...

    google guava

    Google Guava是一个由Google开发并维护的开源Java库,它为Java开发者提供了许多实用的工具类和集合框架,极大地简化了常见的编程任务。这个框架包含了多个模块,如基础(base)、缓存(cache)、I/O(io)以及并发...

    Guava教程1使用GoogleCollections,G

    Guava的Optional类是Java 8 Optional的前身,用于表示可能为null的值,避免空指针异常。例如: ```java Optional&lt;String&gt; optional = Optional.ofNullable(getValue()); if (optional.isPresent()) { System....

    guava-master.zip

    在Java 8之前,Guava的Optional类已经提供了防止null值引起的异常的良好解决方案,强制开发者明确处理可能的缺失值。 通过研究"guava-master.zip"中的源代码,我们可以了解Guava库的实现原理,学习Google在编程...

    java基础 集合-26-Guava开源组件使用(4)

    4. **Optional类**:Guava的Optional类用于表示可能存在也可能不存在的值,避免了null值带来的问题。它鼓励开发者更明确地表达代码逻辑,降低了空指针异常的风险。 5. **预加载(Predicates)** 和 **函数式编程**:...

    Optional:Java8 中可选类的反向移植

    通过返回`Optional`对象而不是null,API消费者可以更好地理解方法可能的行为,而无需查看具体的实现细节。 总的来说,虽然Java 8之前的版本没有内置的`Optional`类,但通过自定义实现或使用第三方库,我们可以在旧...

    996视频学习笔记-20211115.docx

    比如,Guava的`Optional&lt;T&gt;`类可以用来表示一个值可能存在也可能不存在,避免了传统的null值可能导致的空指针异常。`Optional`提供了`of(T t)`、`empty()`和`ofNullable(T t)`等方法来创建实例。 总结来说,Java 8...

    java开发工具类

    5. **Optional**:也是自Java 8引入的一个工具类,用于避免空指针异常,通过Optional对象可以更好地表达null值的存在与否,提高了代码的健壮性。 6. **Collections**:`java.util.Collections`类提供了对集合进行...

    Java程序性能优化之二十三个建议

    19. **避免空对象检查**: 使用Optional类可以避免空指针异常,同时减少显式null检查。 20. **利用Java 8特性**: Lambda表达式、流API等新特性可以写出更简洁高效的代码。 21. **合理使用枚举**: 枚举类型比使用...

    Java性能优化的45个细节

    5. **避免空对象检查**:如果可能,使用Optional类来封装可能为null的对象,减少显式的null检查。 6. **使用equals()与hashCode()的约定**:当重写equals()时,确保同时重写hashCode(),以保持散列码的一致性。 7....

    java常用的工具类

    自Java 8引入,Optional用于避免空指针异常,它可以更清晰地表达代码逻辑,减少null值处理的困扰。 10. **Stream API**: Java 8引入的Stream API,提供了一种新的处理数据的方式,可以进行聚合操作、过滤、映射...

    Dataset-Java:用于作业的Java数据集

    此外,Java 8引入了`Optional`类,它用于表示可能为null的值,有助于避免空指针异常。在处理数据集时,尤其是在进行null检查时,`Optional`可以提高代码的可读性和安全性。 对于需要持久化存储的数据集,Java提供了...

    Java中性能优化的35种方法汇总

    19. 避免空对象检查:使用`Optional`类可以更优雅地处理空值,避免显式的`null`检查。 20. 利用Java的编译器优化:Java HotSpot虚拟机会自动进行许多优化,如逃逸分析、标量替换等。 21. 适当使用多线程:根据任务...

Global site tag (gtag.js) - Google Analytics