`

Google Guava API学习笔记(1):基础

 
阅读更多
   Guava项目包括了多个Google的核心库,包括collections、caching、primitives 、concurrency libraries、common annotations、string processing、I/O等,他们被广泛用于Google项目的开发。

学习地址:http://code.google.com/p/guava-libraries/wiki/GuavaExplained?tm=6

[size=x-lOptional:通过它避免使用null,或说避免null的歧义性[/size]


    避免用null,null是造成BUG的罪魁祸首,举个例子,通过Map#get(key),返回是null,既有可以是没有该键,也有可能是键对应的值是null,这种似是而非的情况容易造成程序Bug。

    为解决这个问题,Guava引入了一个Optional:

    来看一个Optional的使用:
   Optional<Integer> possible = Optional.of(5);//创建一个整数Optional对象
   possible.isPresent(); // returns true
   possible.get(); // returns 5

   如果possible不赋值,则isPresent()为false,否则为true,这样就避免了进行 == null的判断。
  
   Optional可以是任何的对象的封装对象,有了它,你就可以避免使用 ==null的判断了。

   它有3个静态方法:
|Optional.of(T) | Make an Optional containing the given non-null value, or fail fast on null.|
|Optional.absent() | Return an absent Optional of some type.|
|Optional.fromNullable(T) |Turn the given possibly-null reference into an Optional, treating non-null as present and null as absent.|

   另外还有几个非表态方法:

boolean isPresent() Returns true if this Optional contains a non-null instance.
T get() Returns the contained T instance, which must be present; otherwise, throws an IllegalStateException.
T or(T) Returns the present value in this Optional, or if there is none, returns the specified default.
T orNull() Returns the present value in this Optional, or if there is none, returns null. The inverse operation of fromNullable.
Set<T> asSet() Returns an immutable singleton Set containing the instance in this Optional, if there is one, or otherwise an empty immutable set.


Preconditions:一般用于方法入参校验

    入参预校验,保证方法入参的合法性,及时抛出异常。相当于Spring 的Assert.notNull,Assert.notEmpty的功用,如:

checkArgument(i >= 0, "Argument was %s but expected nonnegative", i);
checkArgument(i < j, "Expected i < j, but %s > %s", i, j);



用于排序的比较器

Ordering

   比较器类,可以很方便地扩展之:
Ordering<String> byLengthOrdering = new Ordering<String>() {
     public int compare(String left, String right) {
       return Ints.compare(left.length(), right.length());
     }
   };

if (Ordering.from(comparator).reverse().isOrdered(list)) { ... }


构造Ordering实现
拥有多个静态方法,方便构造出Ordering实例,如:

natural() Uses the natural ordering on Comparable types.
usingToString() Compares Objects by the lexicographical ordering of their string representations, as returned by toString().
arbitrary() Returns an arbitrary ordering over all objects, for which compare(a, b) == 0 implies a == b (identity equality). There is no meaning whatsoever to the order imposed, but it is constant for the life of the VM.


对Ordering进行控制

reverse() Returns the reverse ordering.
nullsFirst() Returns an Ordering that orders nulls before non-null elements, and otherwise behaves the same as the original Ordering. See also nullsLast().
compound(Comparator) Returns an Ordering which uses the specified Comparator to "break ties."
lexicographical() Returns an Ordering that orders iterables lexicographically by their elements.
onResultOf(Function) Returns an Ordering which orders values by applying the function to them and then comparing the results using the original Ordering.

  nullsFirst()方法显式指定对null这位怪人才要如何处理,对应的有nullsLast()

  假设我们希望按sortedBy字段进行排序:
class Foo {
  @Nullable String sortedBy;
  int notSortedBy;
}


下面的这个排序可以处理可能含有null的sortedBy问题:

Ordering<Foo> ordering = Ordering.natural().nullsFirst().onResultOf(new Function<Foo, String>() {
    public String apply(Foo foo) {
      return foo.sortedBy;
    }
  });


对Ordering常用方法

Method Description See also
greatestOf(Iterable iterable, int k) Returns the k greatest elements of the specified iterable, according to this ordering, in order from greatest to least. Not necessarily stable.leastOf
isOrdered(Iterable) Tests if the specified Iterable is in nondecreasing order according to this ordering.isStrictlyOrdered
sortedCopy(Iterable) Returns a sorted copy of the specified elements as a List.immutableSortedCopy
min(E, E) Returns the minimum of its two arguments according to this ordering. If the values compare as equal, the first argument is returned.max(E, E)
min(E, E, E, E...) Returns the minimum of its arguments according to this ordering. If there are multiple least values, the first is returned.max(E, E, E, E...)
min(Iterable) Returns the minimum element of the specified Iterable. Throws a NoSuchElementException if the Iterable is empty.max(Iterable), min(Iterator), max(Iterator)


Object通用方法的处理

Object定义了若干通用的方法,包括equals,toString等,子类要实现它们往往比较烦人(简单是简单,但大量重复性劳动)

equals

面对null不再需要特殊处理了:
Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true



hashCode
 
Objects.hashCode(field1, field2, ..., fieldn)

  想基于哪些字段产生hashCode,直接指定就可以了。

toString

类似地:
 Objects.toStringHelper(this)
       .add("x", 1)
       .toString();

   // Returns "MyObject{x=1}"
   Objects.toStringHelper("MyObject")
       .add("x", 1)
       .toString();


compare/compareTo
 
   考虑下面的这段“原始”代码:
class Person implements Comparable<Person> {
  private String lastName;
  private String firstName;
  private int zipCode;
  
  public int compareTo(Person other) {
    int cmp = lastName.compareTo(other.lastName);
    if (cmp != 0) {
      return cmp;
    }
    cmp = firstName.compareTo(other.firstName);
    if (cmp != 0) {
      return cmp;
    }
    return Integer.compare(zipCode, other.zipCode);
  }
}

 
  使用ComparisonChain进行排序:
public int compareTo(Foo that) {
     return ComparisonChain.start()
         .compare(this.aString, that.aString)
         .compare(this.anInt, that.anInt)
         .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
         .result();
   }

  注意anEnum是一个数组或List ,都可以了。


处理异常
  
  在tye/catch中处理一些异常,传播另一些异常:
 try {
     someMethodThatCouldThrowAnything();
   } catch (IKnowWhatToDoWithThisException e) {
     handle(e);
   } catch (Throwable t) {
     Throwables.propagateIfInstanceOf(t, IOException.class);
     Throwables.propagateIfInstanceOf(t, SQLException.class);
     throw Throwables.propagate(t);
   }


Signature Explanation
RuntimeException propagate(Throwable) Propagates the throwable as-is if it is a RuntimeException or an Error, or wraps it in a RuntimeException and throws it otherwise. Guaranteed to throw. The return type is a RuntimeException so you can write throw Throwables.propagate(t) as above, and Java will realize that that line is guaranteed to throw an exception.
void propagateIfInstanceOf(Throwable, Class<X extends Exception>) throws X Propagates the throwable as-is, if and only if it is an instance of X.
void propagateIfPossible(Throwable) Throws throwable as-is only if it is a RuntimeException or an Error.
void propagateIfPossible(Throwable, Class<X extends Throwable>) throws X Throws throwable as-is only if it is a RuntimeException, an Error, or an X.


通过如下方法获取异常迹:

Throwable getRootCause(Throwable)
List<Throwable> getCausalChain(Throwable)
String getStackTraceAsString(Throwable)



 
3
5
分享到:
评论

相关推荐

    guava-11.0.2-API文档-中文版.zip

    包含翻译后的API文档:guava-11.0.2-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:11.0.2; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-23.0-API文档-中文版.zip

    包含翻译后的API文档:guava-23.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:23.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-20.0-API文档-中文版.zip

    包含翻译后的API文档:guava-20.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:20.0; 标签:google、guava、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-17.0-API文档-中文版.zip

    包含翻译后的API文档:guava-17.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:17.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-18.0-API文档-中文版.zip

    包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:com.google.guava,artifactId:guava,version:18.0 使用方法:解压翻译后的API文档,用浏览器打开“index.html”...

    guava-20.0-API文档-中英对照版.zip

    包含翻译后的API文档:guava-20.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:20.0; 标签:google、guava、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用...

    guava-19.0-API文档-中英对照版.zip

    包含翻译后的API文档:guava-19.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:19.0; 标签:google、guava、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用...

    guava-18.0-API文档-中英对照版.zip

    赠送原API文档:guava-18.0-javadoc.jar 赠送源代码:guava-18.0-sources.jar 包含翻译后的API文档:guava-18.0-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven信息:groupId:com.google.guava,...

    guava-16.0.1-API文档-中文版.zip

    包含翻译后的API文档:guava-16.0.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:16.0.1; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-30.1.1-jre-API文档-中文版.zip

    赠送原API文档:guava-30.1.1-jre-javadoc.jar; 赠送源代码:guava-30.1.1-jre-sources.jar; 赠送Maven依赖信息文件:guava-30.1.1-jre.pom; 包含翻译后的API文档:guava-30.1.1-jre-javadoc-API文档-中文(简体)...

    Google的Guava工具包

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...

    guava-19.0-API文档-中文版.zip

    包含翻译后的API文档:guava-19.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:19.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-30.1.1-jre-API文档-中英对照版.zip

    赠送原API文档:guava-30.1.1-jre-javadoc.jar; 赠送源代码:guava-30.1.1-jre-sources.jar; 赠送Maven依赖信息文件:guava-30.1.1-jre.pom; 包含翻译后的API文档:guava-30.1.1-jre-javadoc-API文档-中文(简体)-...

    guava-12.0.1-API文档-中英对照版.zip

    包含翻译后的API文档:guava-12.0.1-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven信息:groupId:com.google.guava,artifactId:guava,version:12.0.1 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-22.0-API文档-中文版.zip

    包含翻译后的API文档:guava-22.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:22.0; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开...

    guava-12.0.1-API文档-中文版.zip

    标签:google、guava、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心...

    guava-28.0-android-API文档-中文版.zip

    包含翻译后的API文档:guava-28.0-android-javadoc-API文档-中文(简体)版.zip; Maven坐标:com.google.guava:guava:28.0-android; 标签:google、guava、中文文档、jar包、java; 使用方法:解压翻译后的API文档,...

    guava-API文档

    guava-API文档

    Guava 16.0 API (CHM格式)

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...

    guava-17.0-API文档-中英对照版.zip

    包含翻译后的API文档:guava-17.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:com.google.guava:guava:17.0; 标签:google、guava、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用...

Global site tag (gtag.js) - Google Analytics