开源项目

知识点

相关文章

更多

最近更新

更多

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



相关问答

更多
  • 你能帮我理解这里涉及的权衡吗? 这是一个权衡: 性能 - 不分配临时数组可以节省成本。 但是,人们需要进行一些广泛的代码分析和基准测试来量化这种节省。 (我怀疑在大多数应用程序中它都是微不足道的。请阅读@Voo提供的这个链接 !) 可读性 - 拥有一堆额外的重载会使javadoc混乱。 可维护性 - 有一堆重载是以不需要临时对象的方式实现的,这需要大量的复制/粘贴编程,这使得将来的代码维护更加困难。 实用程序 - 这些重载的使用频率是多少? 我希望答案“很少”。 字节码占用空间 - 这些额外的重载将导致使用 ...
  • 只需从构建器中删除expireAfterWrite (它的可选功能): cache = CacheBuilder.newBuilder() .maximumSize(100) .build(....); 这样只有达到maximumSize时才会逐出条目。 Guava的缓存有很好的文档,但您也应该阅读Wiki页面 。 PS如果用“永久”表示“重新启动后会存在”,那么Guava Cache不适合你,因为它是内存缓存。 Just remove expireAfte ...
  • 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.
  • 番石榴贡献者在这里。 不要使用构造函数,请使用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 argum ...
  • 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 before and ...
  • 在我看来,像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的16个最低 ...
  • Guava为Multimap提供了一种反演方法。 请参见Multimaps.invertFrom 。 如果您不经常需要反演,或者您的multimap很小,这可能对您没问题。 但这种反转是一个昂贵的过程。 您可以通过简单地按照JB Nizet在评论中建议的正向和反向来获得一些效率。 然而,两者都可以是多重映射以允许非唯一性。 Guava supplies an inversion method for Multimap. See Multimaps.invertFrom. This might do fine ...
  • Guava wiki提供了以下使用ValueGraph示例: MutableValueGraph weightedGraph = ValueGraphBuilder.directed().build(); weightedGraph.addNode(1); weightedGraph.putEdgeValue(2, 3, 1.5); // also adds nodes 2 and 3 if not already present weightedGraph.putEdg ...
  • 因为你对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 :需要更新最新的番石榴版本21 ...
  • AbstractScheduledServiced实现Service 。 Service接口描述了生命周期方法,包括startAsync 。 ServiceState枚举文字包含有关其含义的文档。 处于NEW状态的服务(刚刚创建): 处于此状态的服务处于非活动状态。 它做的工作量极少,占用资源极少。 要使服务执行某些有用的操作,您必须将其转换为RUNNING状态 此状态下的服务正在运行。 这就是为什么你必须在它做任何事之前启动服务的原因。 我还建议不要从构造函数中调用startAsync,而是从创建MySe ...