在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。
Java 8星期五
每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能,这些功能利用了lambda表达式,扩展方法和其他好东西。 您可以在GitHub上找到源代码 。
在过去的两个星期五,我们一直在复活节休息,但现在我们又回来了另一篇有趣的文章:
让我们弃用那些旧版库
除了Lambda和扩展方法外,JDK还通过许多新的库代码得到了增强,例如Streams API等。 这意味着我们可以批判性地检查堆栈,并且–令Deprecator医生感到高兴–丢弃了我们不再需要的所有垃圾。
这里有几个,仅举几例:
LINQ风格的库
有很多库试图模拟LINQ(即LINQ-to-Collections部分)。 Oracle认证Streams Developer认证无处不在。
不要误会我的意思。 这与LINQ或Streams更好无关。 它们几乎相同。 但是,既然我们现在在JDK中具有Streams,为什么还要担心LINQ? 此外,用于集合查询的SQLesque语法还是有误导作用。 兰伯达
这是通过奥秘和讨厌的技巧(例如ThreadLocal
在Java中模拟闭包的有趣尝试。 考虑以下代码片段( 从此处获取 ):
// This lets you "close over" the
// System.out.println method
Closure println = closure(); { of(System.out).println(var(String.class));
}// in order to use it like so:
println.apply("one");
println.each("one", "two", "three");
好主意,尽管closure()之后的分号; 在那个不是真正的闭包主体的伪闭包实现块之前……所有这些似乎都很古怪!
现在,我们将编写:
Consumer<String> println = System.out::println;println.accept("one");
Stream.of("one", "two", "three").forEach(println);
这里没有魔术,只有简单的Java 8。
让我们最后一次听到Mario Fusco和Lambdaj的故事 。
Linq4j
显然,这仍在积极开发中……为什么? 请注意,该路线图中还具有LINQ-to-SQL实现,包括:
解析器支持。 修改Java解析器(例如OpenJDK),或编写预处理器。 生成包含表达式树的Java代码。
是的,我们也想为jOOQ提供这样的解析器。 这将使我们能够将SQL真正嵌入到Java中,类似于SQLJ ,但是类型安全。 但是,如果我们拥有Streams API,为什么不立即实现类似Julian Hyde的Linq4j之类的东西,因为他仍在继续工作。 但是我们认为他在错误的角落投资。
集合体
这是一个有趣的名称库,它可以执行以下操作:
from(animals).where("name", eq("Lion")).and("age", eq(2)).all();from(animals).where("name", eq("Dog")).or("age", eq(5)).all();
但是,为什么这样写,当您可以写时:
animals.stream().filter(a -> a.name.equals("Lion")&& a.age == 2).collect(toList());animals.stream().filter(a -> a.name.equals("Dog")|| a.age == 5).collect(toList());
让我们为Wagner Andrade听听。 然后到垃圾箱
一半的番石榴
番石榴几乎是所有应该放在JDK中的各种逻辑的转储。 以com.google.guava.base.Joiner
为例。 它用于字符串连接:
Joiner joiner = Joiner.on("; ").skipNulls();
. . .
return joiner.join("Harry", null, "Ron", "Hermione");
不用了 我们现在可以写:
Stream.of("Harry", null, "Ron", "Hermione").filter(s -> s != null).collect(joining("; "));
还要注意,因为Streams API和lambda表达式使您可以很好地将skipNulls
任务与过滤任务分离,所以不再需要skipNulls
标志和所有其他其他skipNulls
实用程序。
说服了吗 没有?
关于什么:
-
com.google.common.base.Optional
>java.util.Optional
-
com.google.common.base.Predicate
>java.util.function.Predicate
-
com.google.common.base.Supplier
>java.util.function.Supplier
然后,还可以将整套的Functional东西扔到垃圾箱中:
https://code.google.com/p/guava-libraries/wiki/FunctionalExplained
当然,一旦确定要在整个应用程序中使用Guava,就不会很快删除其用法。 但另一方面,我们希望不久将弃用Guava的某些部分,而希望与Java 8集成。
乔达时间
现在,这很容易,因为流行的JodaTime库已标准化为java.time
包。 这是个好消息。
让我们听听“ Joda” Stephen Colebourne以及他为JSR-310所做的出色工作。
Apache Commons-io
java.nio
软件包通过与Streams API很好地集成(或不集成)的新方法变得更好。 任何人都会使用Apache Commons IO的主要原因之一是,在Java 7/8之前读取文件非常繁琐,我的意思是,谁会喜欢这段代码( 从这里开始 ):
try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) {byte[] bytes = new byte[size];file.read(bytes);return new String(bytes); // encoding?? ouch!
}
超过这个?
List<String> lines = FileUtils.readLines(file);
但是忘记后者。 现在,您可以在java.nio.file.Files
使用新方法,例如
List<String> lines = Files.readAllLines(path);
不再需要第三方库!
序列化
全部淘汰,因为JEP 154弃用了序列化。 嗯,它没有被接受,但是我们可以确定删除了大约10%的旧代码库。
多种并发API和助手
借助JEP 155 ,对并发API进行了多种改进,例如ConcurrentHashMaps(我们之前已经在此进行过博客讨论) ,以及令人敬畏的LongAdders,您可以在Takipi博客上阅读有关该文章的精彩文章 。
最近,我是否没有在Guava上看到整个com.google.common.util.concurrent
包? 可能不再需要了。
当然,这是愚人节的玩笑……
Base64编码器
这怎么可能要花这么长时间? 在2003年,我们有了RFC 3548 ,指定了Base16,Base32和Base64数据编码,实际上是基于1993年的RFC 1521或1996年的RFC 2045中指定的base 64编码,如果我们愿意的话深入研究过去,我相信我们会找到更早的引用,这种引用将文本数据编码为文本形式的简单想法。
现在,在2014年,我们终于将JEP 135作为JavaSE8的一部分,因此(您不会相信): java.util.Base64
。
所有这些库都丢到垃圾桶了!
- Apache Commons Codec (除非您正在使用该库中的其他怪异编码
- JAXB的内部Base64编码器
- 高瓦,再次
- JEE的
javax.mail.internet.MimeUtility
- 码头的实施
- 这很奇怪
- 或者这很奇怪
…哎呀,似乎所有人和他们的狗都在JDK 8之前解决了这个限制。
更多?
在评论中提供您的建议! 我们很想听到您的想法(包括示例!)
结论
与任何Java主发行版一样,我们需要学习很多新东西,并且可以删除第三方库。 很好,因为许多好的概念已经合并到JDK中,每个JVM都可以使用它们,而无需外部依赖。
免责声明:并非本文中的所有内容都是认真的。 过去,许多人创作了很多作品。 即使它们现在已过时,它们也非常有用。 继续创新,伙计们!
是否想进一步研究Java 8提供的许多新功能? 去看看Baeldung博客,其中精选了以下Java 8资源列表:
http://www.baeldung.com/java8
…,请继续关注下周的Java 8 Friday博客!
翻译自: https://www.javacodegeeks.com/2014/05/java-8-friday-lets-deprecate-those-legacy-libs.html