在Java 6库中提供Predicate支持

时间:2014-06-18 07:46:42

标签: java java-8 backwards-compatibility

我主要使用Java 8,但同时也创建了一个使用Java 6的库,这样其他人也可以在将来使用它,因为它非常有趣。

我现在遇到的问题是我可以通过使用Java 8 Predicate<T>轻松解决某些问题,但我不确定如何向后移植它。

我看到以下选项可用,但它们有问题或者我不确定如何使用它们:

  • 使用Google Guava的Predicate<T>,然而这引入了一个相对较大的依赖,我并不真正需要它,当Java 8用户想要使用Predicate,然后Google Guava导入{{ 1}}班出现。
  • 使用我自己的Predicate,没有很大的依赖性,仍然与上面提到的问题相同。
  • 使用像Predicate<T>这样的自定义名称,因为 Tess 在我的项目中将是相关名称,也不会感觉很好。
  • 使用在项目设置中有意义的名称,例如(暂定)TessPredicate<T>,因为它除了使用正则表达式之外还是谓词,因此您还可以对元素进行计算。银行代码等通常需要一些您需要计算的校验和。实现为功能接口,这可能是最可行的吗?
  • 从Java 8到Java 6的Backport RegexVerficationPredicate,这是否可能?

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

由于在这些界面中大量使用java.util.functiondefault方法,您无法向后移植static包。这样的后卫看起来会有很大不同。

我建议尽可能减少创建自己的Predicate<T>接口,即使用与Java 8 Predicate<T>具有相同签名的单一抽象方法。具有相同的接口名称和方法签名,如众所周知的行为,如自我文档。

这意味着使用Java 8的程序员仍然可以使用lambda表达式或方法引用来实现谓词(甚至不导入interface)。使用Java 8谓词就像将predicate::test传递给您的方法一样简单。

仅为一个界面为整个第三方库添加依赖关系对我来说很难看。

答案 1 :(得分:1)

我建议使用番石榴。当我第一次使用它的时候,我的想法是一样的(依赖性太大)然后随着时间的推移,我开始使用番石榴提供的其他功能,现在我不明白如何在没有它们的情况下(这些是我现在必须拥有的工具)代码更清晰,更快速,更易于维护。

java SDK(特别是java 8)从Guava中获取了很多功能这一事实说明了很多......因此即使你很难编写自己的实现,长期使用库也更为可取......