返回顶部
首页 > 资讯 > 精选 >Java 8 的头疼问题都有哪些
  • 873
分享到

Java 8 的头疼问题都有哪些

2023-06-17 07:06:27 873人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关Java 8 的头疼问题都有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 并行Streams实际上可能会降低你的性能Java8带来了最让人期待的新特性之

这篇文章将为大家详细讲解有关Java 8 的头疼问题都有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1. 并行Streams实际上可能会降低你的性能

Java8带来了最让人期待的新特性之–并行。parallelStream() 方法在集合和流上实现了并行。它将它们分解成子问题,然后分配给不同的线程进行处理,这些任务可以分给不同的CPU核心处理,完成后再合并到一起。实现原理主要是使用了fork/join框架。好吧,听起来很酷对吧!那一定可以在多核环境下使得操作大数据集合速度加快咯,对吗?

不,如果使用不正确的话实际上会使得你的代码运行的更慢。我们进行了一些基准测试,发现要慢15%,甚至可能更糟糕。假设我们已经运行了多个线程,然后使用.parallelStream() 来增加更多的线程到线程池中,这很容易就超过多核心CPU处理的上限,从而增加了上下文切换次数,使得整体都变慢了。

基准测试将一个集合分成不同的组(主要/非主要的):

Map<Boolean, List<Integer>> groupByPrimary = numbers .parallelStream().collect(Collectors.groupingBy(s -> Utility.isPrime(s)));

使得性能降低也有可能是其他的原因。假如我们分成多个任务来处理,其中一个任务可能因为某些原因使得处理时间比其他的任务长很多。.parallelStream() 将任务分解处理,可能要比作为一个完整的任务处理要慢。来看看这篇文章, Lukas Krecan给出的一些例子和代码 。

提醒:并行带来了很多好处,但是同样也会有一些其他的问题需要考虑到。当你已经在多线程环境中运行了,记住这点,自己要熟悉背后的运行机制。

2. Lambda 表达式的缺点

lambda表达式。哦,lambda表达式。没有lambda表达式我们也能做到几乎一切事情,但是lambda是那么的优雅,摆脱了烦人的代码,所以很容易就爱上lambda。比如说早上起来我想遍历世界杯的球员名单并且知道具体的人数(有趣的事实:加起来有254个)。

List lengths = new ArrayList(); for (String countries : Arrays.asList(args)) {     lengths.add(check(country)); }

现在我们用一个漂亮的lambda表达式来实现同样的功能:

Stream lengths = countries.stream().map(countries -< check(country));

哇塞!这真是超级厉害。增加一些像lambda表达式这样的新元素到Java当中,尽管看起来更像是一件好事,但是实际上却是偏离了Java原本的规范。字节码是完全面向对象的,伴随着lambda的加入 ,这使得实际的代码与运行时的字节码结构上差异变大。阅读更多关于lambda表达式的负面影响可以看Tal Weiss这篇文章。

从更深层次来看,你写什么代码和调试什么代码是两码事。堆栈跟踪越来越大,使得难以调试代码。一些很简单的事情譬如添加一个空字符串到list中,本来是这样一个很短的堆栈跟

at LmbdaMain.check(LmbdaMain.java:19) at LmbdaMain.main(LmbdaMain.java:34)

变成这样:

at LmbdaMain.check(LmbdaMain.java:19) at LmbdaMain.lambda$0(LmbdaMain.java:37) at LmbdaMain$$Lambda$1/821270929.apply(Unknown Source) at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948) at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512) at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502) at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.util.stream.LongPipeline.reduce(LongPipeline.java:438) at java.util.stream.LongPipeline.sum(LongPipeline.java:396) at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526) at LmbdaMain.main(LmbdaMain.java:39

lambda表达式带来的另一个问题是关于重载:使用他们调用一个方法时会有一些传参,这些参数可能是多种类型的,这样会使得在某些情况下导致一些引起歧义的调用。Lukas Eder 用示例代码进行了说明。

提醒:要意识到这一点,跟踪有时候可能会很痛苦,但是这不足以让我们远离宝贵的lambda表达式。

3. Default方法令人分心

Default方法允许一个功能接口中有一个默认实现,这无疑是Java8新特性中最酷的一个,但是它与我们之前使用的方式有些冲突。那么既然如此,为什么要引入default方法呢?如果不引入呢?

Defalut方法背后的主要动机是,如果我们要给现有的接口增加一个方法,我们可以不用重写实现来达到这个目的,并且使它与旧版本兼容。例如,拿这段来自oracle Java教程中添加指定一个时区功能的代码来说:

public interface TimeClient { // ... static public ZoneId getZoneId (String zoneString) { try {     return ZoneId.of(zoneString); } catch (DateTimeException e) {     System.err.println("Invalid time zone: " + zoneString +     "; using default time zone instead.");     return ZoneId.systemDefault();     } } default public ZonedDateTime getZonedDateTime(String zoneString) {     return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));     } }

就是这样,问题迎刃而解了。是这样么?Default方法将接口和实现分离混合了。似乎我们不用再纠结他们本身的分层结构了,现在我们需要解决新的问题了。想要了解更多,阅读Oleg Shelajev在RebelLabs上发表的文章吧。

提醒:当你手上有一把锤子的时候,看什么都像是钉子。记住它们原本的用法,保持原来的接口而重构引入新的抽象类是没有意义的。

4. 该如何拯救你,Jagsaw?

Jigsaw项目的目标是使Java模块化,将JRE分拆成可以相互操作的组件。这背后最主要的动机是渴望有一个更好、更快、更强大的Java嵌入式。我试图避免提及“物联网”,但我还是说了。减少jar的体积,改进性能,增强安全性等等是这个雄心勃勃的项目所承诺的。

但是,它在哪呢?Oracle的***Java架构师, Mark Reinhold说: Jigsaw,通过了探索阶段 ,最近才进入第二阶段,现在开始进行产品的设计与实现。该项目原本计划在Java8完成。现在推迟到Java9,有可能成为其最主要的新特性。

提醒:如果这正是你在等待的, Java9应该在2016年间发布。同时,想要密切关注甚至参与其中的话,你可以加入到这个邮件列表。

5. 那些仍然存在的问题

受检异常

没有人喜欢繁琐的代码,那也是为什么lambdas表达式那么受欢迎的的原因。想想讨厌的异常,无论你是否需要在逻辑上catch或者要处理受检异常,你都需要catch它们。即使有些永远也不会发生,像下面这个异常就是永远也不会发生的:

try {     HttpConn.setRequestMethod("GET"); }&thinsp;catch (ProtocolException pe) {  }

原始类型

它们依然还在,想要正确使用它们是一件很痛苦的事情。原始类型导致Java没能够成为一种纯面向对象语言,而移除它们对性能也没有显著的影响。顺便提一句,新的JVM语言都没有包含原始类型。

运算符重载

James Gosling,Java之父,曾经在接受采访时说:“我抛弃运算符重载是因为我个人主观的原因,因为在c++中我见过太多的人在滥用它。”有道理,但是很多人持不同的观点。其他的JVM语言也提供这一功能,但是另一方面,它导致有些代码像下面这样:

javascriptEntryPoints <<= (sourceDirectory in Compile)(base =>     ((base / "assets" ** "*.js") --- (base / "assets" ** "_*")).get )

事实上这行代码来自Scala Play框架,我现在都有点晕了。

提醒:这些是真正的问题么?我们都有自己的怪癖,而这些就是Java的怪癖。在未来的版本中可能有会发生一些意外,它将会改变,但向后兼容性等等使得它们现在还在使用。

6. 函数式编程&ndash;为时尚早

函数式编程出现在java之前,但是它相当的尴尬。Java8在这方面有所改善例如lambdas等等。这是让人受欢迎的,但却不如早期所描绘的那样变化巨大。肯定比Java7更优雅,但是仍需要努力增加一些真正需要的功能。

其中一个在这个问题上最激烈的评论来自Pierre-yves Saumont,他写了一系列的文章详细的讲述了函数式编程规范和其在Java中实现的差异。

所以,选择Java还是Scala呢?Java采用现代函数范式是对使用多年Lambda的Scala的一种肯定。Lambdas让我们觉得很迷惑,但是也有许多像traits,lazy evaluation和immutables等一些特性,使得它们相当的不同。

提醒:不要为lambdas分心,在Java8中使用函数式编程仍然是比较麻烦的。

关于Java 8 的头疼问题都有哪些就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Java 8 的头疼问题都有哪些

本文链接: https://lsjlt.com/news/287703.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 8 的头疼问题都有哪些
    这篇文章将为大家详细讲解有关Java 8 的头疼问题都有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 并行Streams实际上可能会降低你的性能Java8带来了最让人期待的新特性之...
    99+
    2023-06-17
  • Java字符串问题具体都有哪些
    Java字符串问题具体都有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,...
    99+
    2023-06-17
  • Java初学者的30个常见问题都有哪些
    Java初学者的30个常见问题都有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我可以用%除以一个小数吗? a += b 和 a = a + b 的效果有区...
    99+
    2023-06-17
  • Java LeetCode 题目让你头疼?这些教程或许能帮你!
    LeetCode 是一个非常受欢迎的编程练习平台,它提供了大量的算法题目,供程序员们进行练习和挑战。对于 Java 开发者来说,LeetCode 上的题目是一种非常好的提高编程技能的方式。但是,对于初学者来说,LeetCode 上的题目可...
    99+
    2023-07-21
    leetcode 教程 关键字
  • 每个Java初学者都应该搞懂的问题有哪些
    这篇文章主要为大家展示了“每个Java初学者都应该搞懂的问题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“每个Java初学者都应该搞懂的问题有哪些”这篇文章吧。每个Java初学者都应该搞懂...
    99+
    2023-06-03
  • 攻克 Python 基础难关:破解初学者头疼的问题
    1. 数据类型混淆 问题:将不同数据类型混合使用,导致程序出错。例如,将字符串与数字相加。 解决方案:明确了解每种数据类型(如整数、浮点数、字符串)的用途,并使用适当的转换函数进行类型转换。 2. 缩进错误 问题:缩进不当导致语法错...
    99+
    2024-03-13
    对于初学者来说 掌握 Python 基础是一个必经之路 但在这个过程中难免会遇到一些令人头疼的问题。本文将深入分析这些常见问题 并提供详细的解决方案 帮助初学者顺利攻克 Python 基础难关。
  • Android的面试题都有哪些
    今天就跟大家聊聊有关Android的面试题都有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android基础View的绘制流程;自定义View如何考虑机型适配;自定义View的...
    99+
    2023-05-30
    android
  • Mysql MHA部署的常见问题都有哪些呢
    这篇文章将为大家详细讲解有关Mysql MHA部署的常见问题都有哪些呢,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Mysql MHA部署-07常见问题架构...
    99+
    2024-04-02
  • java都有哪些容器
    本篇内容主要讲解“java都有哪些容器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java都有哪些容器”吧!java容器有:ArrayList、LinkedList、Vector、HashSe...
    99+
    2023-06-20
  • Python都有哪些面试题
    本篇内容介绍了“Python都有哪些面试题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!两个列表[1,5,7,9]和[2,2,6,8]合并为...
    99+
    2023-06-02
  • Java并发问题有哪些
    这篇文章主要介绍“Java并发问题有哪些”,在日常操作中,相信很多人在Java并发问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发问题有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-02
  • Java常见问题有哪些
    这篇文章给大家分享的是有关Java常见问题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问: 如何设置Java 2(JDK1.2)的环境变量    答: Java 2安装后,需要设置PATH和JA...
    99+
    2023-06-03
  • 有关Java反射的问题有哪些
    这篇文章主要讲解了“有关Java反射的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有关Java反射的问题有哪些”吧!反射可以修改final类型成员变量吗final我们应该都知道,...
    99+
    2023-06-15
  • java 7和java 8的区别有哪些
    相对于java7,Java8的新特性如下:一、接口的默认方法Java 8允许给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。二、Lambda 表达式三、函数式接口四、方法与构造函数引用五、Lam...
    99+
    2019-09-10
    java入门 java 7 java 8 区别
  • MySQL关于事务常见的问题都有哪些呢
    这期内容当中小编将会给大家带来有关MySQL关于事务常见的问题都有哪些呢,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。所谓事务,是指一组相互依赖的操作单位的集合,用来保证...
    99+
    2024-04-02
  • SQL中连续N天都出现的问题有哪些
    这篇文章主要介绍“SQL中连续N天都出现的问题有哪些”,在日常操作中,相信很多人在SQL中连续N天都出现的问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL中连续...
    99+
    2024-04-02
  • 前端的面试题都有哪些
    这篇文章给大家介绍前端的面试题都有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、标签属性中title和alt的区别答:title是设置鼠标移动到图片上时显示的内容,而alt是用...
    99+
    2024-04-02
  • JAVA 8新特性有哪些
    这篇文章主要介绍“JAVA 8新特性有哪些”,在日常操作中,相信很多人在JAVA 8新特性有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JAVA 8新特性有哪些”的疑惑...
    99+
    2024-04-02
  • 有哪些Java GC的相关问题
    这篇文章主要介绍“有哪些Java GC的相关问题”,在日常操作中,相信很多人在有哪些Java GC的相关问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些Java GC的相关问题”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • java中的易混问题有哪些
    今天给大家介绍一下java中的易混问题有哪些。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。第一,final, finally, finalize的区别。fin...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作