【问题标题】:Writing Java 7 library code to work well with Java 8 lambdas编写 Java 7 库代码以很好地与 Java 8 lambda 配合使用
【发布时间】:2014-04-16 05:34:59
【问题描述】:

我正在编写需要在 Java 7 中运行和编译的库代码,因此我无法直接使用 Java 8 中的新 lambda 功能。

但是我仍然希望代码能够方便地与 Java 8 一起使用。例如:

  • 如果 Java 8 用户可以将内部类/vistor 样式模式用作 Lambda,将会很有帮助
  • 我想提供方便与 lambda 一起使用的 API

我应该采用哪些做法来确保我的库的 Java 7 和 Java 8 用户都能获得最佳体验?

【问题讨论】:

  • 作为 lamda 的只是客户端 - 即消费方法不知道它正在被传递一个 lambda - 没有。只需像往常一样编写代码即可。您可能尝试什么并提供比其他方式更多的单一方法接口 - 即要求两个都是 SMI 的参数,而不是一个执行两项任务的单个参数 - 但这也会污染代码Java 7 用户。

标签: java lambda functional-programming backwards-compatibility java-8


【解决方案1】:

Lambda 表达式基于单方法接口。在任何使用单方法接口实现的地方(例如,实现具有一个方法的接口的匿名内部类),Java 8 用户都可以使用 lambda 表达式。

看看 Java 8 中集合类是如何修改的;例如添加到IterableforEach 方法。这些方法中的每一个都将单方法接口作为参数。

看看:

为了使您的库对 Java 8 之前的用户可用,您可能还希望提供支持旧样式迭代集合的方法;不要强迫这些用户使用大量匿名内部类。

【讨论】:

  • “使用单方法接口实现的任何地方...”不是任何地方。有些不能变成 lambdas。例如:使用实例变量的匿名类、具有递归调用自身方法的匿名类、在代码中使用this 的匿名类,以及匿名类对象的标识的独特性很重要的匿名类。
猜你喜欢
  • 2019-10-04
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2010-09-11
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多