Java8的新特性有:默认方法、函数式接口、lambda表达式、方法引用、Stream、Optional、日期API。

 一、默认方法:

  接口中的方法可以有方法体,但是必须要有static或者default修饰,其他的方法都为抽象方法,由static修饰的方法不能被子接口继承 、方法不能被覆写,只能通过类名.方法名调用;由default修饰的方法可以被子接口继承,也可以被覆写,调用通过实现类的对象调用。

二、函数式接口:

  接口中有且仅有一个抽象方法,一般都有@FuntionalInterface注解,即使没有注解它还是函数式接口。

常见的函数式接口:Comparetor、Runnable。

三、lambda表达式:

  可以看成是对匿名内部类的简写,使用lambda表达式的接口必须为函数式接口;

    注:匿名内部类会编译产生两个class文件,但lambda表达式只会编译产生一个class文件。

    (参数1,参数2…)表示参数列表;->表示连接符;{}内部是方法体
    1、=右边的类型会根据左边的函数式接口类型自动推断;
    2、如果形参列表为空,只需保留();
    3、如果形参只有1个,()可以省略,只需要参数的名称即可;
    4、如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
    5、形参列表的数据类型会自动推断;

    6、lambda表达式中使用的局部变量默认会被final修饰,不管这个局部变量是在lamdba表达式里定义的还是在表达式外定义的。因此只要是lambda表达式中使用过的局部变量就不能再修改了,不管在什么位置。

 

四、方法引用:

    4.1 构造方法引用:

  1. //匿名内部类
  2. PersonFacotry facotry = new PersonFacotry() {
  3.   @override
  4.   public Person createPerson(String name, Integer age){
  5.     //其他操作
  6.     return new Person (name, age);
  7.   }
  8. };
  9. //lambda表达式写法
  10. PersonFacotry facotry1 = (name, age) -> new Person (name, age);
  11.  
  12. //lambda表达式简写(这种写法的函数式接口有几个参数,就调用其对应参数个数的构造方法)
  13. PersonFacotry facotry2 = Person:: new;
  14.  
  15. Person person = facotry.createPerson ( name: "某某某", age: 100) ;
  16. System.out.println(person);

    

    4.2静态方法引用

  1. public class Test{
  2. public static void main(string[] args) {
  3. //匿名内部类方式
  4. Parseinterface pil = new ParseInterface(){
  5. @override
  6. public int parse(string str) {
  7. return Integer.parselnt(str);
  8. }
  9. };
  10.  
  11. // Lambda表达式常规写法
  12. ParseInterface pi2 = str->Integer.parseInt(str);
  13.  
  14. // Lambda表达式简写
  15. ParseInterface pi3 = Integer::parseInt;
  16. }
  17. }

    4.3实例方法引用

  Java1.8提供了一个函数式接口Function,接受两个参数

  匿名内部类方式

  1. string str ="Hello.world";
  2. //匿名内部类的方式
  3. Function<String,Boolean> func1= new Function<String,Boolean> (){
  4. @override
  5. public Boolean apply(strinq suffix) {
  6. return str.endswith (suffix);
  7. }
  8. };

  Lambda表达式常规写法

  1. // Lambda表达式常规写法
  2. String str = "Hello.world";
  3. Function<String,Boolean> func3 = t -> str.endsWith(t);
  4. System.out.println(func3.apply("world"));

  Lambda表达式简写

  1. // Lambda表达式常规写法
  2. String str = "Hello.world";
  3. Function<String,Boolean> func2 = t -> str::endsWith;
  4. System.out.println(func2.apply("world"));

五、Stream:

    Java 8 API添加了一个新的抽象称为流Stream,Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

      注意:和IO中的流是完全不一样的。

    在 Java 8 中, 集合接口有两个方法来生成流:

      stream() − 为集合创建串行流。(常用)

      parallelStream() − 为集合创建并行流。

  Stream常用方法:

  ForEach:

      Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:

  1. Random random = new Random();
  2.  
  3. random.ints().limit(10).forEach(System.out::println);

  map:

    map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:

  1. List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
  2.  
  3. // 获取对应的平方数
  4.  
  5. List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());

  filter:

    filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:

  1. List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
  2.  
  3. // 获取空字符串的数量
    int count = strings.stream().filter(string -> string.isEmpty()).count();

  limit:

    limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

  1. Random random = new Random();
  2.  
  3. random.ints().limit(10).forEach(System.out::println);

  sorted:

    sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

  1. Random random = new Random();
  2.  
  3. random.ints().limit(10).sorted().forEach(System.out::println);

  并行(parallel)程序:

    parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

  1. List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
  2.  
  3. // 获取空字符串的数量
  4.  
  5. int count = strings.parallelStream().filter(string -> string.isEmpty()).count();

    我们可以很容易的在顺序运行和并行直接切换。

  Collectors:

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

  1. List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
  2.  
  3. List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
  4.  
  5. System.out.println("筛选列表: " + filtered);
  6.  
  7. String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
  8.  
  9. System.out.println("合并字符串: " + mergedString);

六、Optional:

  Optional对象可以为空,所以Optional 类的引入很好的解决空指针异常。

    通过以下实例来了解Optional类的使用:

  1. Public class User{
  2.  
  3.   private String name;
  4.  
  5.   private String password;
  6.  
  7.   ....
  8.  
  9. }

以往的判断方式:

  1. public class Mytest{
  2.  
  3.   public static void main(String[] args){
  4.  
  5.    User user = new User();
  6.  
  7.     User.setPassword(“admin”);
  8.  
  9.     String name = getPwd(user);
  10.  
  11.     System.out.println(name);
  12.  
  13.   }
  14.  
  15.   public static String getPwd(User u){
  16.  
  17.     if(u==null){
  18.  
  19.      return unknown”;
  20.  
  21.   }
  22.  
  23.    return u.getPassword();
  24.  
  25. }

使用Optional:

  1. public static String getPwd(User u){
  2.  
  3.   return Optional.ofNullable(u)
  4.  
  5.          .map(user->user.getPassword())
  6.  
  7.          .orElse(“unknown”);
  8.  
  9. };

七、日期Api:

Jdk1.8给我们提供了三个本地日期时间类:LocalDate、LocalTime 和 LocalDateTime 类。

在不需要处理时区问题的时候,使用本地日期时间API(LocalDate、LocalTime 和 LocalDateTime) :

  1. // 获取当前的日期时间
  2.  
  3. LocalDateTime currentTime = LocalDateTime.now();
  4.  
  5. System.out.println("当前时间: " + currentTime);
  6.  
  7. LocalDate date1 = currentTime.toLocalDate();
  8.  
  9. System.out.println("date1: " + date1);
  10.  
  11. Month month = currentTime.getMonth();
  12.  
  13. int day = currentTime.getDayOfMonth();
  14.  
  15. int seconds = currentTime.getSecond();
  16.  
  17. System.out.println("月: " + month +", 日: " + day +", 秒: " + seconds);

在需要处理时区的时候,使用时区的日期时间API(ZonedDateTime ):

  1. ZonedDateTime dd= ZonedDateTime.now();
  2. System.out.println(dd);
  3. ZonedDateTime date1 = ZonedDateTime.parse(dd.toString());
  4. System.out.println("date1: " + date1);
  5. ZoneId id = ZoneId.of(ZoneId.SHORT_IDS.get("CTT"));
  6. System.out.println("ZoneId: " + id);
  7. ZoneId currentZone = ZoneId.systemDefault();
  8. System.out.println("当期时区: " + currentZone);

JAVA 8 的新特性的更多相关文章

  1. [转] Java 8的新特性

    简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子 ...

  2. Java 8的新特性—终极版

    作者:杜琪[译] 原文链接:http://www.jianshu.com/p/5b800057f2d8 1. 简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本 ...

  3. Java 9和Java 10的新特性

    http://www.infoq.com/cn/news/2014/09/java9 Java 9新特性汇总 继2014年3月份Java 8发布之后,Open JDK加快了开发速度, Java 9的发 ...

  4. Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结

    Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结 1.1. Java的编年史2 ...

  5. JDK 15 JAVA 15的新特性展望

    目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...

  6. Java最近版本新特性使用介绍

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在阅读<Thinking in Java>的过程中,并发这一章出现不少新特性,工作中也有 ...

  7. Java API —— JDK5新特性

    JDK5新特性         自动拆装箱.泛型.增强for.静态导入.可变参数.枚举   1.增强for概述         1)简化数组和Collection集合的遍历         2)格式: ...

  8. Java SE 6 新特性: Java DB 和 JDBC 4.0

    http://www.ibm.com/developerworks/cn/java/j-lo-jse65/index.html 长久以来,由于大量(甚至几乎所有)的 Java 应用都依赖于数据库,如何 ...

  9. Java SE 6 新特性: 对脚本语言的支持

    2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...

  10. Java SE 6 新特性: 编译器 API

    新 API 功能简介 JDK 6 提供了在运行时调用编译器的 API,后面我们将假设把此 API 应用在 JSP 技术中.在传统的 JSP 技术中,服务器处理 JSP 通常需要进行下面 6 个步骤: ...

随机推荐

  1. Robots 2019南京网络赛 (概率dp)

    Robots \[ Time Limit: 1000 ms \quad Memory Limit: 262144 kB \] 题意 有一个机器人要从 \(1\) 点走到 \(n\) 点,每走一步都需要 ...

  2. LeetCode 934. Shortest Bridge

    原题链接在这里:https://leetcode.com/problems/shortest-bridge/ 题目: In a given 2D binary array A, there are t ...

  3. strings命令(转)

    以前我用strings命令的频率不高, 现在越用越顺手, 而且已经是离不开strings命令了.虽然以前说过strings命令, 但今天还是要说. 主要是两大用途, 下面来说明一下: 一. 确认代码编 ...

  4. zabbix_server [22842]: cannot open log: cannot create semaphore set: [28] No space left on device

    zabbix server服务没启动,查看日志显示 zabbix_server [22842]: cannot open log: cannot create semaphore set: [28] ...

  5. Django 基础篇(一)

    创建虚拟环境 创建:mkvirtualenv [虚拟环境名称] 删除:rmvirtualenv [虚拟环境名称] 进入:workon [虚拟环境名称] 退出:deactivate 所有的虚拟环境,都位 ...

  6. Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId

    Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...

  7. centos7安装yum

    由于不小心把自带的yum给卸载了,卸载命令:rpm -qa yum: 在浏览器打开链接:http://mirrors.163.com/centos/6/os/x86_64/Packages/下载这四个 ...

  8. Android相关视频

    Android架构师 层次分析 –从顶层到底层 洞察其原理https://www.bilibili.com/video/av59066641?t=132安卓/Android 逆向破解系统班 第2期 全 ...

  9. 信息熵 Information Entropy

    信息熵用于描述信源的不确定度, 即用数学语言描述概率与信息冗余度的关系. C. E. Shannon 在 1948 年发表的论文A Mathematical Theory of Communicati ...

  10. SyntaxError: expected expression, got ")" void() : 1: 5

    这个错误的意思是: 本来希望得到 一个 表达式, 缺得到了 ), 凡是 这样的错误, 就是 函数 在当前位置, 需要一个参数! 参数没有给, 就 输入 ) 右括号了! 错误位置 1: 5, 就是 指 ...