开源项目

相关文章

更多

最近更新

更多

Guava Optional类详解-处理null值

2019-04-23 23:00|来源: 网路

Optional用于包含非空对象的不可变对象。 Optional对象,用于不存在值表示null。这个类有各种实用的方法,以方便代码来处理为可用或不可用,而不是检查null值。

类声明

以下是com.google.common.base.Optional<T>类的声明:

@GwtCompatible(serializable=true)
public abstract class Optional<T>
   extends Object
      implements Serializable


类方法

S.N. 方法及说明
1 static <T> Optional<T> absent()
返回没有包含的参考Optional的实例。
2 abstract Set<T> asSet()
返回一个不可变的单集的唯一元素所包含的实例(如果存在);否则为一个空的不可变的集合。
3 abstract boolean equals(Object object)
返回true如果对象是一个Optional实例,无论是包含引用彼此相等或两者都不存在。
4 static <T> Optional<T> fromNullable(T nullableReference)
如果nullableReference非空,返回一个包含引用Optional实例;否则返回absent()。
5 abstract T get()
返回所包含的实例,它必须存在。
6 abstract int hashCode()
返回此实例的哈希码。
7 abstract boolean isPresent()
返回true,如果这支架包含一个(非空)的实例。
8 static <T> Optional<T> of(T reference)
返回包含给定的非空引用Optional实例。
9 abstract Optional<T> or(Optional<? extends T> secondChoice)
返回此Optional,如果它有一个值存在; 否则返回secondChoice。
10 abstract T or(Supplier<? extends T> supplier)
返回所包含的实例(如果存在); 否则supplier.get()。
11 abstract T or(T defaultValue)
返回所包含的实例(如果存在);否则为默认值。
12 abstract T orNull()
返回所包含的实例(如果存在);否则返回null。
13 static <T> Iterable<T> presentInstances(Iterable<? extends Optional<? extends T>> optionals)
从提供的optionals返回每个实例的存在的值,从而跳过absent()。
14 abstract String toString()
返回此实例的字符串表示。
15 abstract <V> Optional<V> transform(Function<? super T,V> function)
如果实例存在,则它被转换给定的功能;否则absent()被返回。

继承的方法

这个类继承了以下类的方法:

  • java.lang.Object

Optional示例:

使用所选择的编辑器,创建下面的java程序,比如 C:/> Guava

GuavaTester.java

import com.google.common.base.Optional;

public class GuavaTester {
   public static void main(String args[]){
      GuavaTester guavaTester = new GuavaTester();

      Integer value1 =  null;
      Integer value2 =  new Integer(10);
      //Optional.fromNullable - allows passed parameter to be null.
      Optional<Integer> a = Optional.fromNullable(value1);
      //Optional.of - throws NullPointerException if passed parameter is null
      Optional<Integer> b = Optional.of(value2);		

      System.out.println(guavaTester.sum(a,b));
   }

   public Integer sum(Optional<Integer> a, Optional<Integer> b){
      //Optional.isPresent - checks the value is present or not
      System.out.println("First parameter is present: " + a.isPresent());

      System.out.println("Second parameter is present: " + b.isPresent());

      //Optional.or - returns the value if present otherwise returns
      //the default value passed.
      Integer value1 = a.or(new Integer(0));	

      //Optional.get - gets the value, value should be present
      Integer value2 = b.get();

      return value1 + value2;
   }	
}


验证结果

使用javac编译器编译如下类

C:\Guava>javac GuavaTester.java


现在运行GuavaTester看到的结果

C:\Guava>java GuavaTester


看到结果。

First parameter is present: false
Second parameter is present: true
10



相关问答

更多

为什么Guava不为小的ImmutableLists使用专门的类?(Why does Guava not use specialized classes for small ImmutableLists?)

你能帮我理解这里涉及的权衡吗? 这是一个权衡: 性能 - 不分配临时数组可以节省成本。 但是,人们需要进行一些广泛的代码分析和基准测试来量化这种节省。 (我怀疑在大多数应用程序中它都是微不足道的。请阅读@Voo提供的这个链接 !) 可读性 - 拥有一堆额外的重载会使javadoc混乱。 可维护性 - 有一堆重载是以不需要临时对象的方式实现的,这需要大量的复制/粘贴编程,这使得将来的代码维护更加困难。 实用程序 - 这些重载的使用频率是多少? 我希望答案“很少”。 字节码占用空间 - 这些额外的重载 ...

如何使guava缓存值永久化(How to Make guava cache value permanent)

只需从构建器中删除expireAfterWrite (它的可选功能): cache = CacheBuilder.newBuilder() .maximumSize(100) .build(....); 这样只有达到maximumSize时才会逐出条目。 Guava的缓存有很好的文档,但您也应该阅读Wiki页面 。 PS如果用“永久”表示“重新启动后会存在”,那么Guava Cache不适合你,因为它是内存缓存。 Just remove expir ...

google guava缓存存储值在哪里?在EJB中使用它是否安全?(Where is google guava cache storing values?..Is it safe to use it in EJB?)

Guava缓存将值存储在RAM中。 请参阅https://github.com/google/guava/wiki/CachesExplained#applicability 。 Guava Caches store values in RAM. See https://github.com/google/guava/wiki/CachesExplained#applicability.

使用table guava for hashbasedTable(Using table guava for hashbasedTable)

番石榴贡献者在这里。 不要使用构造函数,请使用HashBasedTable.create()工厂方法。 (没有参数,或与expectedRows和expectedCellsPerRow 。) 使用table.put("A100", "B100", 5) ,就像使用两个键的Map一样。 Guava contributor here. Don't use the constructor, use the HashBasedTable.create() factory method. (With no ...

番石榴的IntervalTree(IntervalTree in Guava)

Guava没有提供这个,尽管你可以通过找到给定点之前和之后的第一个范围来在RangeSet之上构建这样的东西。 但一般来说,除了类型的比较排序之外,Guava Range对距离,度量或任何其他内容一无所知 。 他们不知道10比15更接近11 。 Guava doesn't provide this, though you might be able to build such a thing on top of a RangeSet by finding the first range befor ...

来自Scala和Guava的Murmur3的不同结果(Different results from Murmur3 from Scala and Guava)

在我看来,像Scala的hashString将UTF-16 char的成对转换为int与Guava的hashUnencodedChars不同(没有Charset的hashUnencodedChars被重命名为)。 斯卡拉: val data = (str.charAt(i) << 16) + str.charAt(i + 1) 番石榴: int k1 = input.charAt(i - 1) | (input.charAt(i) << 16); 在Guava中,索引i处的char变为int的 ...

从Guava Multimap中的值返回键(Return key from value in Guava Multimap)

Guava为Multimap提供了一种反演方法。 请参见Multimaps.invertFrom 。 如果您不经常需要反演,或者您的multimap很小,这可能对您没问题。 但这种反转是一个昂贵的过程。 您可以通过简单地按照JB Nizet在评论中建议的正向和反向来获得一些效率。 然而,两者都可以是多重映射以允许非唯一性。 Guava supplies an inversion method for Multimap. See Multimaps.invertFrom. This might do ...

Guava ValueGraph的简单示例(Simple example of Guava ValueGraph)

Guava wiki提供了以下使用ValueGraph示例: MutableValueGraph<Integer, Double> weightedGraph = ValueGraphBuilder.directed().build(); weightedGraph.addNode(1); weightedGraph.putEdgeValue(2, 3, 1.5); // also adds nodes 2 and 3 if not already present weightedGraph.p ...

不兼容的库版本selenium / guava(Incompatible library version selenium / guava)

因为你对com.google.guava:guava:23.3 org.seleniumhq.selenium:selenium-java:3.0.1依赖性com.google.guava:guava:23.3使用org.seleniumhq.selenium:selenium-java:3.0.1可能会让你在十字路口。 但是Selenium发行说明清楚地提到了以下番石榴依赖性: Selenium v2.49.0 :Bump guava到19版 Selenium v3.1.0 :需要更新最新的番石 ...

使用guava AbstractScheduledService(Using guava AbstractScheduledService)

AbstractScheduledServiced实现Service 。 Service接口描述了生命周期方法,包括startAsync 。 ServiceState枚举文字包含有关其含义的文档。 处于NEW状态的服务(刚刚创建): 处于此状态的服务处于非活动状态。 它做的工作量极少,占用资源极少。 要使服务执行某些有用的操作,您必须将其转换为RUNNING状态 此状态下的服务正在运行。 这就是为什么你必须在它做任何事之前启动服务的原因。 我还建议不要从构造函数中调用startAsync,而是从创 ...