本文包含了对于Java8的一些最佳实践,包括Stream和Lambda表达式的一些基础。
笔者已经使用Java8工作许多年,包括新的应用开发以及迁移旧的应用,感觉是时候总结Java8中一些有用东西的最佳实践。笔者个人不太喜欢“最佳实践”这个词,因为字面上传达了一种“one size fit all”的概念,当然,编码肯定不是这样的而是不同的场景有不同的解决方案。但是笔者觉得在如何使用Java 8让自己的生活变得更加容易上还是有一些特殊的经验值得分享的。
Optional
Optional是一个评价过低的特性,它可以显著的降低代码抛出NullPointerException的可能。它在边界代码(你正在使用的API或者你发布的API)中特别有用。
但是对于它的不适当的使用和设计很容易使一个小的变动影响到很多的类,或者降低代码的可阅读性。这里有一些如何更加高效使用Optional的建议。
Optional应该仅仅用在返回类型中
不要用在参数或者域中。 阅读这篇博文 可以看到如何正确使用Optional进行编码。幸运的是,IntelliJ IDEA可以打开inspections去检查你是否遵循了这些推荐规范。
![物联网](/d/file/news/Internet_of_things/technical/2017-07/1b23f97eb4b95072fe0b147b1ba42019.png)
要尽早在Optional出现的地方对它进行处理。IntelliJ IDEA会阻止Optional出现在你代码的各个地方,所以记住一定要在Optional出现的地方就对他进行处理。
![](/d/file/news/Internet_of_things/technical/2017-07/f5072314d17a79df53ddf3e333fe18de.png)
不能简单地调用get()方法
Optional是用来表示这个值是有可能为空的,让你做好应对的准备。因此,很重要的一点就是在使用这个值之前务必要检查其是否存在。简单地调用get方法而不是先调用isPresent可能会导致产生空指针异常。幸运的是,IntelliJ IDEA再一次提供了对此种方案的检查。
![物联网](/d/file/news/Internet_of_things/technical/2017-07/1bc46ef9c873b1772bfa866f249a0e83.png)
更加优雅的方案
如下代码,isPresent和get当然能够解决这个问题。
![物联网](/d/file/news/Internet_of_things/technical/2017-07/5c8a32f19c19a071dcb5c31d3b0d6eaa.png)
但是这里有更加优雅的方式,你可以使用orElse来设置一个默认值。
![](/d/file/news/Internet_of_things/technical/2017-07/f3f9c5fca6c1f617522680deae555278.png)
或者你可以使用orElseGet来设置当值为null的时候去调用的方法。虽然看着和前面的方案没有什么大的不同。但是提供的方法应该仅仅在需要调用的时候才被调用。那么当这是个代价昂贵的方法时,那么使用lambda会带来更好的性能提升。
![物联网](/d/file/news/Internet_of_things/technical/2017-07/4cf3c8a8d0eb256ed015afbbf998eaec.png)
使用Lambda表达式
Lambda表达式是Java8最主要的卖点。即使你现在用不到Java8,你也应该对它有了一些基本的了解。下面讲述了一种新的方式使用Java编程,虽然这并不是一个“最佳实践”,仅仅是一个使用的指导。
保持简短
函数式编程对于长的lambda表达式是欢迎的,但是对于仅仅使用Java开发很多年的人发现编写短的lambda表达式会更容易一些。你甚至会想把表达式缩减到一行,也很容易把长的表达式重构成一个方法。
![物联网](/d/file/news/Internet_of_things/technical/2017-07/2406fa6ca9da28eab52d887e6a0da20d.png)
当然,这些甚至牵扯到了方法引用(Method References)。方法引用可能看着有点陌生,但是由于其能让代码达到更好的阅读性,还是有很大应用价值的。后面,我会讲到这个概念。
![](/d/file/news/Internet_of_things/technical/2017-07/58b67b818baacd3aec652ba2faac49ca.png)
显式声明
在lambda表达式中是没有类型信息的,所以你会发现在参数中包含类型信息是非常有用的。
![](/d/file/news/Internet_of_things/technical/2017-07/c0b3de2c61096808b5551b56f9c9917a.png)
如你所见,这会变得很笨重。所以我更喜欢赋予参数有意义的名字。当然,无论你是否这么做,IntelljJ IDEA都会让你可以看到参数的类型信息。