java8返回单个号码
借助jOOQ 3.7,我们终于添加了对Java 8功能的正式支持。 这为许多不错的改进打开了大门,例如:
创建结果流
try (Stream<Record2<String, String>> stream =DSL.using(configuration).select(FIRST_NAME, LAST_NAME).from(PERSON).stream()) {List<String> people =stream.map(p -> p.value1() + " " + p.value2()).collect(Collectors.toList());
}
异步调用语句(jOOQ 3.8+)
CompletionStage<Record> result =
DSL.using(configuration).select(...).from(COMPLEX_TABLE).fetchAsync();result.thenComposing(r -> ...);
但是显然,我们不想让那些因使用较旧的应用程序服务器而受Java 6困扰的付费客户感到失望。
如何在单个API中支持多个Java版本
这就是为什么我们继续为商业客户发布Java 6版本的jOOQ 。 我们是怎么做的? 非常简单地。 我们的商业代码库(这是我们的主要代码库)包含大量的“标志”,如以下示例所示:
public interface Query
extends QueryPart, Attachable /* [java-8] */, AutoCloseable /* [/java-8] */
{int execute() throws DataAccessException;/* [java-8] */CompletionStage<Integer> executeAsync();CompletionStage<Integer> executeAsync(Executor executor);/* [/java-8] */}
(当然, AutoCloseable
在Java 7中已经可用,但是我们没有Java 7版本)。
当构建jOOQ时,在使用预处理器从源文件中剥离逻辑之后,我们对其进行了多次构建:
- 商业Java 8版本是按原样构建的
- 通过剥离
[java-8]
和[/java-8]
标记之间的所有代码,构建第二个商业Java 6版本 - 通过向商业版本添加一些代码来构建商业免费试用版。
- 通过剥离
[pro]
和[/pro]
标记之间的所有代码,构建了第三个开源版本
这种方法的优点
与其他方法相比,此方法有几个优点:
- 我们只有一个事实来源,即原始的商业源代码。
- 所有不同版本中的行号均相同
- 这些API在一定程度上是兼容的
- 通过类加载或反射不会涉及任何魔术
缺点是:
- 提交到存储库会比较慢,因为我们有几个存储库。
- 发布版本需要更长的时间,因为需要构建不同的版本并多次测试集成
- 有时,我们只是忘了添加一个标记,而当Java-6每晚构建崩溃时,我们不得不重新构建
- 我们仍然不能在Java 6版本(大多数代码)中包含的普通代码中使用lambda表达式。
我们认为,优势明显胜过。 只要我们的客户能够,并且只要那些受困于旧版本的客户仍然能够升级到最新的jOOQ版本,就可以实现一流的Java功能就可以了。
我们期待在不影响现有用户的情况下支持JDK 9功能,例如模块化和新的Flow API 。
你呢?
您如何实现跨JDK版本的兼容性?
翻译自: https://www.javacodegeeks.com/2016/03/support-java-6-8-9-single-api.html
java8返回单个号码