java8的新特性

Java8没有安排释放,直到2014年3月,但早期发行版本已经可用了一段时间。 一些最有趣的新功能是:

  • 功能接口
  • 默认方法
  • Lambdas
  • Java时间

新的java.util.stream软件包包含“支持元素流上的功能样式操作的类”。 流不是一种新的集合,并且不替换任何现有的集合,例如列表和队列。 相反,它们提供了一种与现有集合进行交互的方式,并且在这方面与迭代器更相似。

javadocs将流描述为“支持顺序和并行聚合操作的元素序列”。 流管道由产生结果(例如,总和或计数)的源(例如,集合),中间操作(例如,过滤器或映射)和终端操作组成。 流是惰性的,因为对数据的操作仅在最后一分钟(即,在调用终端操作时)执行,并且流仅处理一次。

例如:

int totalFxTrading = blocks.stream().filter(trade -> trade.getType() == FX).mapToInt(b -> b.getTradedAmount()).sum();

功能接口

Java 8将具有称为功能接口的新功能。 功能接口只有一种抽象方法。 您可能已经将许多这样的接口用作Java开发人员,例如Runnable,ActionListener,Comparator和Callable。 在Java 8中,这些类型的接口现在更正式地称为功能接口。 可以使用新的@FunctionalInterface批注来标识它们,最重要的是,可以使用Lambda表达式(稍后再介绍)来表示它们。 例如,过去要使用ActionListener,需要创建一个实现,通常使用匿名内部类。

例如:

JButton button = new JButton();button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent ae) {System.out.println(ae.getSource());}});

使用功能接口,这变得更加简单:

JButton myButton = new JButton();button.addActionListener(ae -> {System.out.println("You clicked the button");});

我们甚至不需要提及ActionEvent –编译器从上下文中得出“ ae”的类型。 请注意, @ FunctionalInterface批注(如@Override批注)不是必需的。 相反,它向编译器发出信号,表明您的意图,以便在某些地方出现问题(例如多个抽象方法可用)时向您发出警告。

默认方法

在Java7之前,接口是相当简单的事情。 它只能包含必须由具体子类实现的抽象方法(和常量)。 接口基本上是一堆方法签名,但是永远不能包含方法定义/实现。

在Java8中,事情变得更加有趣。 现在可以将默认方法添加到接口。 这些是具有实现的方法,不必在接口实现中重写,并且可以直接从接口运行。

添加这些默认方法是为了提供向后兼容性。 如果未添加它们,则例如在不破坏所有实现的情况下就不可能扩展/改善现有的收集接口。 因此,由于这个原因,默认方法有时称为防御者方法。

对我来说,默认方法的真正有趣之处在于它们允许多种形式的继承。 由于一个类可以实现多个接口,并且每个接口现在都可以具有一个具有相同名称的默认方法,因此该子类可以继承哪个版本? 我认为这被称为钻石问题 。 如果在使用Java8时出现这种情况,编译器将提供警告。 您可以使用语法X.super.m(…)显式选择父类的实现之一。

附带说明一下,为什么这些新的默认方法完全需要default关键字? 如果没有该关键字,他们是否也能正常工作? 答案是肯定的,默认关键字是多余的,就像抽象关键字一样。 两者都被添加以使事情更加清晰。 这篇文章有一些更多的细节是链接。

拉姆达

根据Wikipedia的说法,lambda表达式是“定义为不绑定标识符的函数”。 Lambda表达式已进入Java版本,旨在简化代码。

我上面讨论的许多其他更改(默认方法,功能接口)与引入lambas密切相关。

编写Lambda表达式时,它将在编译时转换为功能接口。 这是一个使用Lambda表达式用更简洁易读的代码替换匿名内部类的示例。
没有Lambda的旧方法:

button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {System.out.println(“Action Detected”);}});

Lambda的新方法:

button.addActionListener(e -> {System.out.println(“Action Detected”);});

使用Lambda表达式通常会使代码更易于阅读,并且所需的行数更少。

Java时间

用Java处理日期和时间从来都不是理想的。 充其量,它是古怪的,而最糟的是,它是一场噩梦。 Date类很笨重,现在已被不推荐使用的方法所困扰。 Calendar类是一种改进,但是我个人似乎总是花更多的时间来浏览API文档,即使我以前做过这些事情。 其他第三方图书馆则尝试以更简洁的方式处理时间(例如,乔达时间)。 有传言说Java8和Java8改进了Java itslef和anf的处理,这就是java.time包。

一个新的(抽象)Clock类提供了一些有用的静态方法,例如systemUTC()和systemDefaultZone()来获取当前时间和时区。 并且许多新类(例如LocalDate和LocalTime以及YearMonth和MonthDay)提供了更为优雅的日常(对双关语)日期操作。

可以在JSR-310站点上找到更多详细信息。

Java8中没有的内容

在一个侧面说明,虽然日期/时间的处理将在Java8得到改善,令人惊讶的还有没有好的办法来处理货币的Java(东西我已经在博客 ,在过去)。 双打(以及所有浮点数)天生就不适合花钱,或者需要精确计算的任何地方。 使用int或long需要跟踪小数点,BigDecimal也不理想。 JSR-354可能会有所改进,但看起来我们必须等到Java 9才能完成。

参考:来自Shaun Abram博客博客的JCG合作伙伴 Shaun Abram的Java8 。

翻译自: https://www.javacodegeeks.com/2013/10/java8.html

java8的新特性

java8的新特性_Java8的相关推荐

  1. 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类

    1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...

  2. JAVA8的新特性之Stream

    JAVA8的新特性之Stream 1.概述: 在jdk1.8中,提供了一个Stream,可以对数据进行过滤 2.好处: 比不断自定义循环,要简单很多 Stream类型数据的获取 1.Collectio ...

  3. JAVA8的新特性之函数式接口

    JAVA8的新特性之函数式接口 1.Lambda表达式使用的前提,就是接口必须是一个函数式接口 2.定义 在接口中,只有一个抽象方法 3.检查是否是函数式接口用的注解 @FunctionalInter ...

  4. java8:新特性及Lamber表达式语法及四大函数接口

    java8:新特性及Lamber表达式 如果左侧只有一个参数可以省略括号,如果右侧只有一个表达式可以省略括号 如果左侧有一个参数也可以添加括号,可以不写参数类型,有类型推断 如果右侧有返回值,一个表达 ...

  5. 对于Java8的新特性,应该了解(掌握)的哪些

    Java8的新特性 一.Lambda表达式 基本的使用方式 Lambda表达式的使用:6种情况 语法格式一:无参,无返回值 语法格式二:Lambda表达式需要一个参数,但是没有返回值 语法格式三:数据 ...

  6. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

  7. Java8部分新特性介绍

    研究过一些技术论坛,总结出来Java8的一些新的特性,其中我印象最深的就是 lambda表达式,让我们代码变得简洁,可读性高. 一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现, ...

  8. java8新特性_Java8新特性之Date API|乐字节

    大家好,我是乐字节的小乐,上篇文章讲述了<Java8新特性之Optional>,接下来,小乐将接着讲述Java8新特性之Date API 2019日历 Java8之Date API Jav ...

  9. java8新特性_Java8新特性_lambda表达式

    lambda介绍 λ ,希腊字母表中排序第十一位的字母,英语名称为Lambda. lambda 表达式,也可称为闭包,它是推动==Java 8== 发布的最重要新特性,允许把函数作为一个方法的参数(函 ...

最新文章

  1. wxWidgets:添加菜单栏
  2. Android Java和JavaScript互调
  3. clodeblocks debug断点调试_idea debug调试————简单常用,适合初学者
  4. mysql存储过程是不是不能穿sql语句_mysql存储过程能不能直接执行拼接的sql语句...
  5. Nginx大规模并发原理
  6. 01.26 小组功能初步总结
  7. My blog in AI ---神经网络,神经元(neural network,nervecell)
  8. Flutter快速上车之Widget 1
  9. 语音识别技术是什么 语音识别技术应用介绍【图文】
  10. Linux 系统级开启文件句柄 调优
  11. 新学到的Url形成方法
  12. 【转】git使用教程
  13. 一、Oracle学习笔记:认识数据库
  14. IE9如何降级返回IE8
  15. 梦三国测试服显示连接服务器失败,《梦三国》梦三国服务器未连接攻略
  16. WIN10卸载搜狗后语言栏仍有残留解决方案
  17. GYM 101350 M. Make Cents? ( STL
  18. std::tr1::function and std::tr1::bind
  19. 熊猫人表情包python 代码,Python熊猫替换特殊字符
  20. Glib学习(17) Key-value文件解析器 Key-value file parser

热门文章

  1. 【并查集】团伙(luogu 1892)
  2. 【dfs】【bfs】【链表】 求连通分量 (ssl 1759)
  3. Codefroces1077F2. Pictures with Kittens (hard version)
  4. 漫画:什么是优先队列
  5. 零配置 之 Spring 注解实现Bean依赖注入
  6. (四)十大经典排序算法(动画图解,代码完全)
  7. 使用枚举定义常量更好点儿
  8. ssm(Spring+Spring mvc+mybatis)Dao层配置sql的文件——DeptDaoMapper.xml
  9. ssh(Spring+Spring mvc+hibernate)——hibernate.cfg.xml
  10. 最全三大框架整合(使用映射)——Dept.hbm.xml