标签 Guava 下的文章

TypeToken

由于类型擦除,您不能在运行时传递泛型类对象——您可以转换它们并假装它们是泛型的,但实际上它们不是。

示例:

ArrayList<String> stringList = Lists.newArrayList();
ArrayList<Integer> intList = Lists.newArrayList();
System.out.println(stringList.getClass().isAssignableFrom(intList.getClass()));
// returns true, even though ArrayList<String> is not assignable from ArrayList<Integer>

Guava提供了TypeToken, 它使用了基于反射的技巧甚至让你在运行时都能够巧妙的操作和查询泛型类型。想象一下TypeToken是创建,操作,查询泛型类型(以及,隐含的类)对象的方法。

- 阅读剩余部分 -

内容

  • 基本的独立数学函数根据涉及的主要数字类型分为IntMathLongMathDoubleMathBigIntegerMath。这些类具有并行结构,但每个类只支持函数的相关子集。请注意,在com.google.common.primitives类中也可以找到类似的函数,它们本质上不那么数学化。
  • 为单个和成对的数据集提供了各种统计计算(平均值、中位数等)。从阅读本文开始,而不仅仅是浏览Javadoc。
  • LinearTransformation 表示 y = mx + b的两个值之间的线性变换; 例如,英尺和米之间的换算,或者凯尔文和摄氏温度之间的换算。

示例:

int logFloor = LongMath.log2(n, FLOOR);

int mustNotOverflow = IntMath.checkedMultiply(x, y);

long quotient = LongMath.divide(knownMultipleOfThree, 3, RoundingMode.UNNECESSARY); // fail fast on non-multiple of 3

BigInteger nearestInteger = DoubleMath.roundToBigInteger(d, RoundingMode.HALF_EVEN);

BigInteger sideLength = BigIntegerMath.sqrt(area, CEILING);

- 阅读剩余部分 -

事件总线

EventBus允许组件之间的发布-订阅式通信,而不需要组件彼此显式注册(因此可以相互感知)。它专门用于使用显式注册替代传统的Java进程内事件分发。它不是一个通用的发布-订阅系统,也不是用于进程间通信。

示例:

// Class is typically registered by the container.
class EventBusChangeRecorder {
  @Subscribe public void recordCustomerChange(ChangeEvent e) {
    recordChange(e.getChange());
  }
}
// somewhere during initialization
eventBus.register(new EventBusChangeRecorder());
// much later
public void changeCustomer()
  ChangeEvent event = getChangeEvent();
  eventBus.post(event);
}

- 阅读剩余部分 -

概述

Java内建的散列码[hash code]概念被限制为32位,并且没有分离散列算法和它们所作用的数据,因此很难用备选算法进行替换。此外,使用Java内建方法实现的散列码通常是劣质的,部分是因为它们最终都依赖于JDK类中已有的劣质散列码。

Object.hashCode往往很快,但是在预防碰撞上却很弱,也没有对分散性的预期。这使得它们很适合在散列表中运用,因为额外碰撞只会带来轻微的性能损失,同时差劲的分散性也可以容易地通过再散列来纠正(Java中所有合理的散列表都用了再散列方法)。然而,在简单散列表以外的散列运用中,Object.hashCode几乎总是达不到要求——因此,有了com.google.common.hash包。

- 阅读剩余部分 -

示例

List<Double> scores;
Iterable<Double> belowMedianScores = Iterables.filter(scores, Range.lessThan(median));
...
Range<Integer> validGrades = Range.closed(1, 12);
for(int grade : ContiguousSet.create(validGrades, DiscreteDomain.integers())) {
  ...
}

简介

区间,有时也称为范围,是特定域中的凸性(非正式说法为连续的或不中断的)部分。在形式上,凸性表示对 a<=b<=c, range.contains(a)range.contains(c)意味着 range.contains(b)

- 阅读剩余部分 -

字节流和字符流

Guava使用术语“stream”来表示I/O数据的可关闭流,这些数据在底层资源中具有位置状态。术语“byte stream”指的是InputStreamOutputStream,而“char stream”指的是阅读器或写入器(尽管它们的ReadableAppendable常用作方法参数)。相应的实用程序分为ByteStreamsCharStreams实用程序类。

大多数Guava流工具一次处理一个完整的流,并且为了效率自己处理缓冲。还要注意到,接受流为参数的Guava方法不会关闭这个流:关闭流的职责通常属于打开流的代码块。

- 阅读剩余部分 -

概述

Java的基本类型:byteshortintlongfloatdoublecharboolean

在从Guava查找原生类型方法之前,可以先查查Arrays类,或者对应的基础类型包装类,如Integer

原生类型不能当作对象或泛型的类型参数使用,这意味着许多通用方法都不能应用于它们。Guava提供了若干通用工具,包括原生类型数组与集合API的交互,原生类型和字节数组的相互转换,以及对某些原生类型的无符号形式的支持。

- 阅读剩余部分 -

介绍

InternetDomainName是一个用于解析和操作域名的工具。它可以用作验证器、组件提取器和值类型,以便以类型安全的方式传递域名。

然而,InternetDomainName行为在某些方面可能会令人吃惊,并可能导致调用代码的错误。本文档解决了这些问题。

详情

公共后缀和私有域

根据相关的RFC规范,可以保证InternetDomainName对象在语法上是有效的,但不能保证它与Internet上的实际可寻址域相对应。如果不进行域的网络查找并尝试与它联系,就不可能做到这一点,对于大多数情况,这是无法接受的开销。

不过,确定给定的域名是否代表Internet上的实际域名通常非常有用。为此,我们使用来自公共后缀列表Public Suffix List (PSL)的数据,该列表由Mozilla基金会维护。在InternetDomainName上有一些方法来确定给定域与PSL之间的关系。用最基本的术语来说,如果domain.haspublicsuffix()返回true,则该域可能对应一个实际的Internet地址;否则,它几乎肯定不会。

- 阅读剩余部分 -

Joiner

用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦。如果字符串序列中含有null,那连接操作会更难。Fluent 风格的Joiner让连接字符串更简单。

Joiner joiner = Joiner.on("; ").skipNulls();
return joiner.join("Harry", null, "Ron", "Hermione");

上述代码返回”Harry; Ron; Hermione”。另外,useForNull(String)方法可以给定某个字符串来替换null,而不像skipNulls()方法是直接忽略nullJoiner也可以用来连接对象类型,在这种情况下,它会把对象的toString()值连接起来。

Joiner.on(",").join(Arrays.asList(1, 5, 7)); // returns "1,5,7"

- 阅读剩余部分 -

概述

Guava包里的Service用于封装一个服务对象的运行状态、包括startstop等方法。例如web服务器,RPC服务器、计时器等可以实现这个接口。对此类服务的状态管理并不轻松、需要对服务的开启/关闭进行妥善管理、特别是在多线程环境下尤为复杂。Guava 包提供了一些基础类帮助你管理复杂的状态转换逻辑和同步细节。

使用一个服务

一个服务正常生命周期有:

- 阅读剩余部分 -