Guava源码分析——Optional

Google的Guava库的出现,使Java代码的书写更加流畅,无论是从效率还是代码风格上,Guava都必将成为一种趋势(Java8明显可以看出,大多数的功能开始借鉴Guava),今天开始,PoNa就以自己微薄的水平试着分析一下Guava的源码,借此使自己更上一层楼,还请各位多多扔砖。

Guava文档中,第一篇就提到的尽量避免使用Null,会给代码带来一些负面影响,并举出map.get(key) == null,带来的混淆。由此。Guava提出了Optional的概念。

如图所示,Guava的Optional有两种实现,Absent和Present,这就可以理解为,传统代码书写方式中的null和non-null。而Guava中Absent和Present中重写Optional的isPresent()方法,是的Absent和Present有了最本质的区别(false,true)。

Optional也提供了一些从null或者non-null转换为Optional的方法,例如:Optional.fromNullable(getTFromXXX());从源码中可以看出,转换很简单。

 public static <T> Optional<T> fromNullable(@Nullable T nullableReference) {
        return (nullableReference == null) ? Optional.<T>absent() : new Present<T>(nullableReference);
 }

如下,也成为了Optional最常用的方法,代替了if(null == instance)的书写方式

Optional.fromNullable(getTFromCache()).or(Optional.fromNullable(getTFromDB()).transform(new Function<Object, Object>() {    @Override    public Object apply(Object input) {        addCache(input);        return input;

    }}));

上面这段代码与下面代码功能相同

  T result = getTFromCache();

  if (null == result) {
    resut = getTFromDB();
     if(result != null) {
        addCache(result);
      }
  }
  return result;

以上就是自己对Optional的一些理解,还望大家多多指教。

时间: 2024-08-14 20:46:42

Guava源码分析——Optional的相关文章

Guava 源码分析之Cache的实现原理

Guava 源码分析之Cache的实现原理 前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的. 缓存 本次主要讨论缓存.缓存在日常开发中举足轻重,如果你的应用对某类数据有着较高的读取频次,并且改动较小时那就非常适合利用缓存来提高性能. 缓存之所以可以提高性能是因为它的读取效率很高,就像是 CPU 的 L1.L2.L3 缓存一样,级别越高相应的读取速度也会越快. 但也

Guava源码分析——Immutable Collections(1)

在Java中,conrrent包提供了很多线程安全的集合,但有的时候我们可以换一种方式对思考使用线程安全集合,Guava的Immutable提供了一系列不可变集合类型,不可变就使得集合成为了常量,常量必然线程安全.对于集合的不可变,除了Guava提供的Immutable Collections以外,还是有Collections.unmodifiableCollection(),而两者之间,还是有些区别的.从UML图中,可以看出,ImmutableCollection继承了AbstractColl

Guava源码分析——Preconditions

Preconditions作为Guava中异常的前置检查,提供了一系列方法.从源码的实现中可以看出,所有的方法都满足以下形式(除format()方法以外). if (!status) { throw new xxException(); } 例如: public static void checkArgument(boolean expression) { if (!expression) { throw new IllegalArgumentException(); } } 源码实现比较简单,

Guava源码分析——Multi Collections(1)

Immutable集合作为Guava提供的集合类型,并没有脱离集合的接口,例如ImmutableList依然实现List接口.但接下来几章要分析的Multi Collections则几乎脱离了JAVA原本所带的集合(这也是为什么Multixxx,代表集合数据结构的单词为小写),作为了JAVA集合的一个补充. 对于Map<T,Integer>这样的Map结构,会经常被使用到,而我们统计T出现的次数的时候,大多时候进行的操作遍历统计,代码如下所示: Map<String, Integer&g

Guava源码分析——Immutable Collections(3)

这一次,我们来分析ImmutableSet,与ImmutableList大同小异,建议大家先看完上一篇Immutable Collections(2),在继续往下看 相同: ImmutableSet底层也采用数组实现 of().copyOf()方法实现逻辑也相同 元素也是按传入顺序排列的 实现是根据元素个数,分为EmptyImmutableSet.SingletonImmutableSet.RegularImmutableSet 不同: construct()方法的实现不再是简单的copy,需要

Guava源码分析——Immutable Collections(2)

分析过Immutable Collections后,进入具体的数据结构来分析,这一次我们来看看ImmutableList.作为线性可重复集合,ImmutableList的底层实现采用了数组,因为不可变集合,就不存插入删除的操作.数组的下标使得根据index的read的操作,时间复杂度变为了O(1).对于ImmutableList的两种实现,我们先来看下UML图. 首先,我们看下构造一个ImmutableList的方法 @Test public void constructImmutableLis

Guava源码分析——Immutable Collections(4)

Immutable的集合体系,还有中很重要的集合没有介绍,就是ImmutableMap,通过UML图,可以看出ImmutableMap的结构体系. 首先来看一下ImmutableBiMap,因为普通ImmutableMap的实现依赖于它.ImmutableBiMap在ImmutableMap的基础上,加入inverse()等方法,可以使键值反转.ImmutableBiMap的构造,也是根据元素个数的不同,使用不同的实现(0-->EmptyImmutablBiMap,1-->SingletonI

Guava源码分析——Ordering

毋庸置疑,Ordering肯定实现了Comparator<T>接口,这是Java中比较排序使用的.而其中的静态方法返回一种类型的Ordering,不同的Ordering子类实现各自的compare()方法,如下所示: public static <C extends Comparable> Ordering<C> natural() { return (Ordering<C>) NaturalOrdering.INSTANCE; } 实现类有如下: 如果Or

HashMap与TreeMap源码分析

1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Java这么久,也写过一些小项目,也使用过TreeMap无数次,但到现在才明白它的实现原理).因此本着"不要重复造轮子"的思想,就用这篇博客来记录分析TreeMap源码的过程,也顺便瞅一瞅HashMap. 2. 继承结构 (1) 继承结构 下面是HashMap与TreeMap的继承结构: pu