8

具体来说,我正在寻找与Collection<T>.TrueForAll/Exists等类似的干净符号。

必须编写一个 foreach 循环来检查每个对象上的方法的返回感觉很臭,所以我希望有一个更好的 Java 习惯用法。

4

3 回答 3

12

谓词Google Collections库中提供。

于 2009-04-24T20:25:42.190 回答
6

函数式 Java提供一流的函数。谓词表示为F<T, Boolean>。例如,这是一个程序,它测试一个数组是否存在一个全为小写字母的字符串。

import fj.F;  
import fj.data.Array;  
import static fj.data.Array.array;
import static fj.function.Strings.matches;

public final class List_exists {  
  public static void main(final String[] args) { 
    final Array<String> a = array("Hello", "There", "how", "ARE", "yOU?");  
    final boolean b = a.exists(matches.f("^[a-z]*$"));  
    System.out.println(b); // true
  }  
}
于 2009-04-25T03:17:10.767 回答
4

据我所知,没有。但是 Apache Commons Collections有这样的东西:Predicate


编辑:对,正如评论中所指出的,Commons Collections 来自前泛型世界,因此Google Collections更新Guava)现在似乎是一个明显更好的选择。尽管如此,Commons Collections 还是值得一提的,因为它是一个著名的图书馆,它可以做到这一点,而且人们也知道为什么不使用它。:)

我刚刚在对其主要开发人员的这次精彩采访中阅读了有关 Google Collections 的更多信息,并想引用一些专门针对“Google Collections vs. Apache Commons Collections”问题的内容:

你的方法有什么独特之处?例如,它与 Apache Commons Collection 有何不同?

凯文:“嗯,感谢上帝为 Apache Commons 提供了。如果没有这样的库,我们都会处于糟糕的状态。也就是说,很遗憾,在泛型之前的世界中,特定项目已经停滞不前。他们确实想采用泛型,但是他们认识到这将涉及一个非常重要且不兼容的重写。到目前为止,似乎没有人积极推动这样的努力。在谷歌,自 2005 年春天以来,我们一直在全公司范围内使用 Java 5。一个未通用的集合库对我们来说是一个交易破坏者,因为我们真的讨厌收到编译器警告。我还担心 Apache 集合不符合它们实现的 JDK 接口规范的许多地方。

[...]

Jared:“正如 Kevin 所暗示的,我们的库是我所知道的唯一一个在 JDK 之外使用 Java 5 特性构建的集合库:泛型、枚举、协变返回类型等。在编写 Java 5 代码时,您需要一个集合库充分利用了该语言。此外,我们付出了巨大的努力使该库完整、健壮并与 JDK 集合类保持一致。我们的集合类最初受到更多限制,但我们在过去两个中逐渐改进了它们多年来。由于所有库的使用都在 Google 的源代码控制系统中,因此我们可以灵活地修改公共接口。像 Apache Commons Collection 这样的开源项目在初始发布后没有改变其行为的自由。因为我们'一旦 Google Collections Library 1.0 发布,我们就会失去这种灵活性,我们现在渴望收到反馈,这样我们才能把事情做好。”

于 2009-04-24T20:25:58.633 回答