JavaRush /Java 博客 /Random-ZH /您从未听说过的 10 个 Java 8 功能。
Vash_the_Stampede
第 11 级

您从未听说过的 10 个 Java 8 功能。

已在 Random-ZH 群组中发布
拉姆达,拉姆达,拉姆达。当人们谈论 Java 8 时,您所听到的就是这些。但这只是一部分。Java 8 有很多新功能 - 一些强大的新类和惯用语,还有一些从一开始就应该存在的东西。我想继续讨论十个新功能,我认为它们是绝对值得了解的小宝石。其中肯定至少有一两个您想尝试,所以让我们开始吧! 1) 默认方法。 Java 语言中的新增功能,您现在可以向接口添加方法体( 默认方法)。这些方法无条件地添加到所有实现这些接口的类中。这使您有机会向现有库添加新功能,而无需破坏旧代码。这绝对是一个优点。另一方面,它严重模糊了接口和遵循这些条件的类(作为其私有实现)之间的界限,接口要求遵循某些条件作为约定。对于(右)右手来说,这可能是一种使界面更智能、避免重复和扩展库的优雅方式。落入坏人之手;我们很快就会在接口中看到调用它并将其转换为具体类型的方法。Brrr.... 2) 停止进程。 启动一个额外的进程是你做的事情之一,你半知半解地知道当进程(崩溃)(崩溃)中止、(挂起)挂起或使用 100% 的 CPU 时你会回来(调试)调试它。Process 类现在配备了两种新方法来帮助您控制不规则的进程。第一个 isAlive()允许您轻松检查进程是否正在运行,而无需等待它。第二个也是更强大的(警告!)是 destroyForcously(),它允许您(无耻地)强行(杀死)停止超过其时间(等待或其他)或不再需要的进程。 3)冲压锁。 现在来一些真正令人兴奋的事情。没有人喜欢同步代码。这肯定会降低应用程序的性能(尤其是大规模),或更糟糕的是,导致应用程序冻结。然而,有时你就是别无选择。有许多用于同步多线程资源访问的习惯用法。最优选的之一是 ReadWriteLock 和相关实现。此习惯用法允许多个线程使用资源,同时仅阻止操作该资源的线程,从而减少争用。听起来不错,但实际上这个锁太慢了 尤其是在有大量写入线程的情况下。事实证明,这种情况非常糟糕,以至于 Java 8 引入了一种新的 RWLock,称为 StampedLock。这种锁不仅速度更快,而且还提供了强大的乐观锁API,可以以较低的成本获得读锁,希望在代码的关键部分不会发生写操作。在该部分的末尾,您询问锁在那段时间内是否发生了记录,在这种情况下您可以决定是否重试、升级锁或放弃。这把锁是一个强大的工具,值得专门写一篇文章来介绍它。我对这个新玩具感到非常兴奋。伟大的!此外,您还可以阅读 这里4) 竞争记录者。 对于运行多线程应用程序的人来说,这是另一个小宝石。一个简单高效的 新 API,用于从多个线程读取和写入计数器。有时,它甚至比使用 AtomicIntegers 更快。太棒了! 5) 可选(或可选)值。 哦,空指针,让所有Java开发者头疼的问题。也许是所有例外中最受欢迎的,它从很早的时候就已经存在了。至少从 1965年开始。借用 Scala 和 Haskell,Java 8 有一个新模式,称为“Optional”,用于包装可以为 null 的引用。这绝不是消除 null 的灵丹妙药,而是 API 设计者在代码级别(而不是文档)指示可以返回 null 值或将 null 值传递给方法的一种方法,并且调用者必须做好准备。因此,这仅适用于新 API,前提是调用者不允许引用从包装器中逃逸,否则可能会不安全地取消引用。我不得不说我对这个功能很矛盾。一方面,空值仍然是一个大问题,所以我很感谢为解决这个问题所做的一切。另一方面,我非常怀疑这是否会成功。这是因为使用Optional需要整个公司的持续努力,并且没有什么立竿见影的效果。如果没有强有力的执法,它很可能会停留在道路的左侧。 阅读有关可选的更多信息6)注释一切。 Java 语言的另一个小进步是:注释几乎 可以添加到代码中的所有内容中。以前,注释只能添加到类或方法声明等内容中。从 Java 8 开始,在将值转换为特定类型,甚至分配新对象时,可以将注释添加到变量和参数声明中。这是集中努力的一部分(以及对 JavaDoc 工具和 API 的改进),以使该语言对静态分析和测量工具(例如 FindBugs)更加友好。这是一个很好的功能,但就像Java 7 中引入的 invokeDynamic一样,它的真正价值将取决于社会如何使用它。 7) 溢出操作。 现在,这是 一组方法,从第一天起它就应该是核心库的一部分。我最喜欢的爱好是当整数超过 2^32 时调试数字溢出,并继续创建最令人讨厌和最意想不到的错误(即“我到底是如何得到这个奇怪的值的?”)。再说一次,这里没有什么灵丹妙药,但是有很多函数可以处理数字,当它们溢出时,它们会以比标准 +/* 运算符更不宽容的方式抛出,而标准 +/* 运算符会无条件溢出。 8) 浏览目录。 遍历目录树的内容长期以来一直是人们在 Google 上搜索的内容之一(在这种情况下,可能会建议您使用 Apache.FileUtils)。Java 8 通过十个新方法对 Files类进行了改版。我最喜欢的是 walk(),它创建一个惰性线程(对于大型文件系统很重要)来迭代目录结构的内容。 9)强随机生成。 如今,关于密码和密钥的脆弱性的讨论并不缺乏。软件安全是一项复杂的业务并且容易出错。这就是为什么我喜欢新的 SecureRandom 方法。 getinstanceStrong(),它自动选择可用于 Java 虚拟机的最强随机生成器。这减少了您失败或生成器较弱的机会,这将使密钥和加密值更容易受到黑客攻击。 10.Date.toInstant()。 Java 8 引入了一个全新 的日期和时间 API。这是可以理解的,因为现有的不是很好。多年来,Joda 本质上一直致力于使用 Java API 来处理日期和时间。然而,即使使用新的 API,仍然存在一个大问题 - 存在大量使用旧 API 的代码和库。我们都知道他们会留在这里。那么你会怎么做?为了实现这一点,Java 8 做了一些相当优雅的事情,向 Date 类添加了一个名为 toInstant()的新方法,将其转换为新的 API。这使您可以快速跳转到新的 API,即使在使用使用旧日期 API 的代码时也是如此(并且在可预见的未来将继续这样做)。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION