Java 8 开发的 4 大顶级技巧你都知道吗 _第1页
Java 8 开发的 4 大顶级技巧你都知道吗 _第2页
Java 8 开发的 4 大顶级技巧你都知道吗 _第3页
Java 8 开发的 4 大顶级技巧你都知道吗 _第4页
Java 8 开发的 4 大顶级技巧你都知道吗 _第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java8开发的4大顶级技巧,你都知道吗?正文我使用Java8编码已经有些年头,既用于新的应用程序,也用来迁移现有的应用,感觉是时候写一些我发现的非常有用的“最佳实践”。我个人并不喜欢“最佳实践”这个说法,因为它意味着“一刀切”的解决方案,而编码不可能是这样的工作方式——我们需要亲自去发现什么样的解决方案才是有效的。但是我发现了一些Java8代码中可以帮助我们的一些选择,让我们一起来看看吧。1.OptionalOptional是一个严重被低估的功能,并且有潜力删除很多困扰我们的NullPointerExceptions。这在代码边界中(要么是正在使用的API,要么是正在暴露的API)特别有用,因为它允许你和你的调用代码来推理所期待的东西。然而,不加思考和设计就应用Optional可能会导致影响大量的类,并可能导致可读性更差。下面是一些关于如何高效使用Optional的技巧。Optional应该只用于返回类型……不是参数,也不是字段。幸运的是,IntelliJIDEA的让你打开检查来查看是是否遵循这些建议。Optional值应在遇到它们的地方中处理。IntelliJIDEA的建议会防止代码Optional泄漏,所以请记得在你发现Optional的地方处理它,迅速采取行动。不应该简单调用get()Optional的功能是表达这个值可能是空的,并让你应对这种情况。因此,在对它做任何事情之前一定要检查是否有一个值。只是简单得调用get()而不先检查isPresent()在某些时候可能会导致空指针。幸运的是,IntelliJIDEA也有检查可以提醒你这一点。可能有更优雅的方式结合了get()的isPresent()当然会很赞………但也有更优雅的解决方案。你可以使用orElse在万一是空值的情况下给一个替代方案。……或者你可以使用orElseGet说明在值为空的情况下调用哪个方法。这似乎与上面的例子相同,但supplier方法将只在需要的时候调用,因此,如果这是一种昂贵的方法,那么使用lambda会有更佳性能。2.使用Lambda表达式Lambda表达式是Java8的主要特点之一。即使你还没有使用Java8,你现在可能已经对它们有了基本的了解。它们是用Java编程的一种新的方式,并且什么是“最佳实践”还不明显。下面是我喜欢遵循的一些指引。保持简短函数式程序员与较长的lambda表达式相处会更愉快,但那些淫浸于Java多年的人会发现保持lambda表达式为区区几行代码更容易。你甚至可能更愿意将其限制到一行代码,并且你可以轻松重构较长的表达式为一个方法。这些甚至可能会成为方法引用。方法引用一开始会觉得有点陌生,但实际上坚持方法引用是有价值的,因为它们在某些情况下有助于可读性,后面我会讨论到这一点。明确类型信息缺少lambda表达式,所以你可能会觉得包含类型信息用于参数会很有用。正如你所见,这回变得相当笨拙。所以我更喜欢给参数取一个有用的名字。当然,不管你有没有这么做,IntelliJIDEA可以让你看到参数得类型信息。甚至是lambda所代表的函数式接口:3.针对Lambda表达式设计我认为lambda表达式有点像泛型——和泛型一起,我们经常使用它们(例如,添加类型信息到List<>),但最好我们可以设计一种方法或一个具有泛型类型(例如Person<T>)的类。同样的,当使用类似于StreamsAPI的东西时,我们会传递lambda表达式,但更好的是创造一个需要lambda参数的方法。但是,如果你发现自己处于这类情况下,下面有一些超棒的技巧。IntelliJIDEA可以帮你引进函数式参数这让你可以在有人将传递一个lambda而非Object的地方创建一个参数。此功能的好处是,它表明,现有函数式接口匹配规格说明。这会导致…使用现有的函数式接口随着开发人员越来越熟悉Java8代码,我们就能知道当使用如Supplier和Consumer的接口时,会发生什么,以及创建一个本地的ErrorMessageCreator(举个例子)可能会造成混乱,而且浪费。看看这个函数包了解一下哪些已经是可用的。搜索公众号后端架构师后台回复“架构整洁”,获取一份惊喜礼包。添加@FunctionalInterface到函数式接口如果你确实需要创建自己的函数式接口,那么就这样用此注释标记。这似乎没有太大的作用,但IntelliJIDEA会告诉你,在你的接口不能匹配用于函数式接口的异常的时候。当你没有指定要覆盖的方法时,它会标志:当你指定了太多方法的时候,它会标志:并且如果你应用它到一个类而不是接口时,它会警告你:lambda表达式可用于带有一个单一抽象方法的任何接口,但它们不能用于符合相同标准的抽象类。似乎不合逻辑,但就是这样。4.StreamStreamAPI是Java8另一个大特点,并且我认为我们还真的不知道这对我们的编码方式会产生多大的改变。下面是我发现的一些有用的东西排队点操作符我个人更喜欢排队我的流操作。当然,你没有必要这样,当我发现这样做对我有帮助:一目了然地看到我有哪些操作调试更容易(虽然IntelliJIDEA确实提供了对一行中的任意多个lambda表达式设置断点的能力,但是拆分到不同的行会变得更简单)当我测试东西的时候注释操作轻松插入peek()用于调试或测试此外,在我看来,它更整洁。如果我们按照这个模式,在减少代码行数方面我们并没有增加很多。你可能需要调整格式设置以排列点操作符。使用方法引用是的,确实需要一段时间来适应这个奇怪的语法。但是,如果使用得当,它确实可以增加可读性。请看:与(相对)新的Objects类上的辅助方法相比较:后者的代码对于哪些值是要保存的更加明确。当lambda可以被折叠到方法参考的时候,IntelliJIDEA通常会让你知道。当遍历一个集合时,在可行的情况下使用StreamsAPI…或者新的集合方法,如forEach。IntelliJIDEA给你建议是:一般使用StreamsAPI比循环和if语句的组合更加明确。例如:IntelliJIDEA建议这可重构为:我所做的性能测试表明这种重构令人惊讶——并不总是可预测性能是保持不变,改善还是变得更糟。与往常一样,如果性能在应用程序中是关键,那么在交付一种风格到另一种之前衡量它。遍历数组时使用循环但是,使用Java8并不一定意味着你必须到处使用流和新的集合方法。IntelliJIDEA会建议转换成流,但是,这并不意味着你必须回答“yes

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论