Java 8 开发的 4 大技巧
点击上方 java项目开发 ,选择 星标 公众号
点击上方 java项目开发 ,选择 星标 公众号
重磅资讯,干货,第一时间送达
重磅资讯,干货,第一时间送达
……不是参数,也不是字段。幸运的是,IntelliJ IDEA的让你打开检查来查看是是否遵循这些建议。
![](https://filescdn.proginn.com/a308c4466a1122805c5b10496e0b4752/a6b7f753afe3cf25c4f81eb7376f3c2d.webp)
![](https://filescdn.proginn.com/e31e571616673782695c67740baf8b01/687c9e0573b6d8e3126debad96638bfd.webp)
Optional的功能是表达这个值可能是空的,并让你应对这种情况。因此,在对它做任何事情之前一定要检查是否有一个值。只是简单得调用get()而不先检查isPresent()在某些时候可能会导致空指针。幸运的是,IntelliJ IDEA也有检查可以提醒你这一点。
![](https://filescdn.proginn.com/c5d161245638fc9d1ae17359e7d59410/c81e9a4b4ec250a1d653b6a0e14e52d1.webp)
结合了get()的isPresent()当然会很赞…
![](https://filescdn.proginn.com/d10aaad6e4cd29730bd846da54e22de2/577e4f5add397b7f99bcda057f9d62bc.webp)
![](https://filescdn.proginn.com/1d6afd394a85ff148592b972a630a537/1ffb62f8f10cd14315d02c6b05cf290a.webp)
![](https://filescdn.proginn.com/527c97e4b636f4d4f2c6493dc923f68a/34435bbe0d8f6369f3a7a21ceb2c4a2a.webp)
函数式程序员与较长的lambda表达式相处会更愉快,但那些淫浸于Java多年的人会发现保持lambda表达式为区区几行代码更容易。你甚至可能更愿意将其限制到一行代码,并且你可以轻松重构较长的表达式为一个方法。
![](https://filescdn.proginn.com/6b5a9c1cd08180dbf317979c53878c71/31bd65dd890be533a0c936f9bb4d04bb.webp)
![](https://filescdn.proginn.com/130a0d9c9f1a18e7f68d2afa61580d69/234e878a0a53d91b93f67adb24cb083f.webp)
类型信息缺少lambda表达式,所以你可能会觉得包含类型信息用于参数会很有用。
![](https://filescdn.proginn.com/5de256157741a94ab1d08c888300c708/0a5f9a9c309cb2446cec53619d4585f2.webp)
![](https://filescdn.proginn.com/cf0cd77c257732861a661424faa96b5d/476738cae1cd6b9aa09428740d5a3c95.webp)
![](https://filescdn.proginn.com/26045d246f4b5ebb81b090fdc2c17158/13a7f855f1016e06a0726ffe1a74fa0f.webp)
我认为lambda表达式有点像泛型——和泛型一起,我们经常使用它们(例如,添加类型信息到List< >),但最好我们可以设计一种方法或一个具有泛型类型(例如Person< T >)的类。同样的,当使用类似于Streams API的东西时,我们会传递lambda表达式,但更好的是创造一个需要lambda参数的方法。
这让你可以在有人将传递一个lambda而非Object的地方创建一个参数。此功能的好处是,它表明,现有函数式接口匹配规格说明。
![](https://filescdn.proginn.com/400901b6bc21e3db83eef4fb86cbc705/b3bed7844fecdc87bb13d2df4ba17ddf.webp)
如果你确实需要创建自己的函数式接口,那么就这样用此注释标记。这似乎没有太大的作用,但IntelliJ IDEA会告诉你,在你的接口不能匹配用于函数式接口的异常的时候。当你没有指定要覆盖的方法时,它会标志:
![](https://filescdn.proginn.com/f6e78270fb68839bffff330af621c2d0/16443171d7917a512329a178f29e997c.webp)
![](https://filescdn.proginn.com/1d34da4ceb5f82a67fc2d598529fec55/193b729819d062fbf0c09494e22e7a79.webp)
![](https://filescdn.proginn.com/758cb9cf4bdea61cc88968e796a8f496/0c488eb5c93a6905f27288478a5701d2.webp)
一目了然地看到我有哪些操作 调试更容易(虽然IntelliJ IDEA确实提供了对一行中的任意多个lambda表达式设置断点的能力,但是拆分到不同的行会变得更简单) 当我测试东西的时候注释操作 轻松插入peek()用于调试或测试
![](https://filescdn.proginn.com/c0e1266642f3f72cf71634b4f0ac8784/6bb46e614284f2ce7d38f70e4f0a7d77.webp)
你可能需要调整格式设置以排列点操作符。
![](https://filescdn.proginn.com/41fc061ba4211ecb23c1af9b28d19fa2/f58c40d3d558b0a312c13138deda357f.webp)
使用方法引用
是的,确实需要一段时间来适应这个奇怪的语法。但是,如果使用得当,它确实可以增加可读性。请看:
![](https://filescdn.proginn.com/8aa4da6a3d459070298e1bf2aaa1e284/baab893cdf5001d1a365e17e4b0e4099.webp)
![](https://filescdn.proginn.com/7917804b811932181391304dfb2d62cc/d83ed92f6329095d406a4b24b1d409dc.webp)
后者的代码对于哪些值是要保存的更加明确。当lambda可以被折叠到方法参考的时候,IntelliJ IDEA通常会让你知道。
![](https://filescdn.proginn.com/57b850cf4fba159ec207f952352491fc/f5548c6f2386a1b4e91d8e09fa9c4c1c.webp)
…或者新的集合方法,如forEach。IntelliJ IDEA给你建议是:
![](https://filescdn.proginn.com/1a5b9035526afe4b1cbc1a144c772b74/6c7dc16548471f534bfae261e6f1adf5.webp)
![](https://filescdn.proginn.com/b195fc09b5f1373b988eaefda3788005/a3e18ec57cefb38837ff7cc73a68d972.webp)
![](https://filescdn.proginn.com/4286484558d70720035b9d809c45d4b8/df897e9a78532d5b60effe64e1f3728c.webp)
我所做的性能测试表明这种重构令人惊讶——并不总是可预测性能是保持不变,改善还是变得更糟。与往常一样,如果性能在应用程序中是关键,那么在交付一种风格到另一种之前衡量它。
遍历数组时使用循环
特别是,遍历原始类型的小型数组几乎肯定会用,以获得更好的性能循环,很可能(至少对于Java开发人员是新的流)更具可读性。
![](https://filescdn.proginn.com/a6fd680c942853d2bf2d3000187714bd/966635b0c426fed3872f7b3d27f24829.webp)
--完-- 推荐阅读:
怎么接私货?这个渠道你100%有用!请收藏!喜欢文章,点个在看