范例 List scores; Iterable belowMedian =Iterables.filter(scores,Range.lessThan(median)); ... Range validGrades = Range.closed(1, 12); for(int grade : ContiguousSet.create(validGrades, DiscreteDomain.integers())) { ... }简介区间,有时也称为范围,是特定域中的凸性(非正式说法为连续的或不中断的)部分。
概述Java 的原生类型就是指基本类型:byte、short、int、long、float、double、char 和 boolean。在从 Guava 查找原生类型方法之前,可以先查查 Arrays 类,或者对应的基础类型包装类,如 Integer。原生类型不能当作对象或泛型的类型参数使用,这意味着许多通用方法都不能应用于它们。
连接器[Joiner]用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦。如果字符串序列中含有 null,那连接操作会更难。Fluent 风格的 Joiner 让连接字符串更简单。 Joiner joiner = Joiner.on("; ").skipNulls(); return joiner.join("Harry", null, "Ron", "Hermione");上述代码返回”Harry; Ron; Hermione”。
概述Guava 包里的 Service 接口用于封装一个服务对象的运行状态、包括 start 和 stop 等方法。例如 web 服务器,RPC 服务器、计时器等可以实现这个接口。对此类服务的状态管理并不轻松、需要对服务的开启/关闭进行妥善管理、特别是在多线程环境下尤为复杂。Guava 包提供了一些基础类帮助你管理复杂的状态转换逻辑和同步细节。
并发编程是一个难题,但是一个强大而简单的抽象可以显著的简化并发的编写。出于这样的考虑,Guava 定义了 ListenableFuture 接口并继承了 JDK concurrent 包下的 Future 接口。我们强烈地建议你在代码中多使用 ListenableFuture 来代替 JDK 的 Future, 因为:大多数 Futures 方法中需要它。转到 ListenableFuture 编程比较容易。
注意事项截至 JDK7,Java 中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果。预计 JDK8 中会有所改变,但 Guava 现在就想给 JDK5 以上用户提供这类支持。过度使用 Guava 函数式编程会导致冗长、混乱、可读性差而且低效的代码。这是迄今为止最容易(也是最经常)被滥用的部分,如果你想通过函数式风格达成一行代码,致使这行代码长到荒唐,Guava 团队会泪流满面。
范例 LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() .maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES) .removalListener(MY_LISTENER) .build( new CacheLoader<Key, Graph>
简介有时候你需要实现自己的集合扩展。也许你想要在元素被添加到列表时增加特定的行为,或者你想实现一个 Iterable,其底层实际上是遍历数据库查询的结果集。Guava 为你,也为我们自己提供了若干工具方法,以便让类似的工作变得更简单。(毕竟,我们自己也要用这些工具扩展集合框架。
尚未完成: Queues, Tables 工具类任何对 JDK 集合框架有经验的程序员都熟悉和喜欢 java.util.Collections 包含的工具方法。Guava 沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法。这是 Guava 最流行和成熟的部分之一。
Guava 引入了很多 JDK 没有的、但我们发现明显有用的新集合类型。这些新类型是为了和 JDK 集合框架共存,而没有往 JDK 集合抽象中硬塞其他概念。作为一般规则,Guava 集合非常精准地遵循了 JDK 接口契约。Multiset统计一个词在文档中出现了多少次,传统的做法是这样的: Map<String, Integer> counts = new HashMap<String, Integer>();
范例 public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of( "red", "orange", "yellow", "green", "blue", "purple"); class Foo { Set<Bar> bars; Foo(Set<Bar> bars) { this.bars = ImmutableSet.copyOf(bars);
异常传播有时候,你会想把捕获到的异常再次抛出。这种情况通常发生在 Error 或 RuntimeException 被捕获的时候,你没想捕获它们,但是声明捕获 Throwable 和 Exception 的时候,也包括了了 Error 或 RuntimeException。Guava 提供了若干方法,来判断异常类型并且重新传播异常。例如: try { someMethodThatCouldThrowAnything();
排序器[Ordering]是 Guava 流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。从实现上说,Ordering 实例就是一个特殊的 Comparator 实例。Ordering 把很多基于 Comparator 的静态方法(如 Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器。
equals当一个对象中的字段可以为 null 时,实现 Object.equals 方法会很痛苦,因为不得不分别对它们进行 null 检查。使用 Objects.equal 帮助你执行 null 敏感的 equals 判断,从而避免抛出 NullPointerException。例如: Objects.equal("a", "a"); // returns true Objects.equal(null, "a"); // returns false Objects.equal("a", null);
前置条件:让方法调用的前置条件判断更简单。Guava 在 Preconditions 类中提供了若干前置条件判断的实用方法,我们强烈建议在 Eclipse 中静态导入这些方法。每个方法都有三个变种:没有额外参数:抛出的异常中没有错误消息;有一个 Object 对象作为额外参数:抛出的异常使用 Object.toString() 作为错误消息;
Doug Lea 说,“Null 真糟糕。”当 Sir C. A. R. Hoare 使用了 null 引用后说,”使用它导致了十亿美金的错误。”轻率地使用 null 可能会导致很多令人惊愕的问题。通过学习 Google 底层代码库,我们发现 95%的集合类不接受 null 值作为元素。我们认为, 相比默默地接受 null,使用快速失败操作拒绝 null 值对开发者更有帮助。此外,Null 的含糊语义让人很不舒服。
Guava 工程包含了若干被 Google 的 Java 项目广泛依赖 的核心库,我们希望通过此文档为 Guava 中最流行和最强大的功能,提供更具可读性和解释性的说明。适用人群本教程是中级教程,适合 Guava 中级开发者的进阶学习。学习前提学习本教程前,建议您先学习 java 语言开发。
与 MATLAB 的区别Julia 的语法和 MATLAB 很像。但 Julia 不是简单地复制 MATLAB ,它们有很多句法和功能上的区别。以下是一些值得注意的区别:数组用方括号来索引, A[i,j]数组是用引用来赋值的。在 A=B 之后,对 B 赋值也会修改 A使用引用来传递和赋值。如果一个函数修改了数组,调用函数会发现值也变了Matlab 把赋值和分配内存合并成了一个语句。比如:a(4) = 3.
会话和 REPL如何删除内存中的对象?Julia 没有 MATLAB 的 clear 函数;在 Julia 会话(准确来说,Main 模块)中定义了一个名字的话,它就一直在啦。如果你很关心内存使用,你可以用占内存的小的来替换大的。例如,如果 A 是个你不需要的大数组,可以先用 A = 0 来释放内存。下一次进行垃圾回收的时候,内存就会被释放了;你也可以直接调用 gc() 来回收。
以下各节从几方面介绍了符合语言习惯的 Julia 编码风格。这些规则都不是绝对的;它们仅仅是帮您熟悉这门语言,或是帮您可以在许多可替代性设计中能够做出选择的一些建议而已。写成函数,别写成脚本编写代码作为在一系列步骤中最高级的办法,是可以快速开始解决问题的,但您应该试着尽快把一个程序分成许多函数。
关注时代Java