Jdk8新特性

一:接口默认方法和静态方法:

我们可以在接口中定义默认方法,使用default关键字,并提供默认的实现。所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现。 我们还可以在接口中定义静态方法,使用static关键字,也可以提供实现。例如:

  1. public interface DefaultFunctionInterface {
  2.  default void defaultFunction() {
  3.  System.out.println("接口DefaultFunctionInterface中的default defaultFunction方法被调用...");
  4.  }
  5.  static void staticFunction() {
  6.  System.out.println("接口DefaultFunctionInterface中的静态方法staticFunction方法被调用...");
  7.  }
  8.  }

子类实现和调用demo:

  1. public class DefaultFunctionInterfaceImpl implements DefaultFunctionInterface {
  2.  public static void main(String[] args){
  3.  DefaultFunctionInterfaceImpl dif = new DefaultFunctionInterfaceImpl();
  4. dif.defaultFunction(); //子类调用父类接口中default方法
  5.  DefaultFunctionInterface.staticFunction();//调用接口中的静态方法
  6.  }
  7. }

讨论java为什么要使用多继承? 接口允许default和static是否会有类似的情况?

二:Lambda表达式

首先来看看老版本的java是如排列字符串的(这里按照字符串的长度排序):

  1.  List<String> strs = Arrays.asList("A","AAAAAAAAAAA","AAA","AAAAAAAAA","AAAAA","AAAAAAAAAAAAA","AAAAAAA");
  2.  Collections.sort(strs, new Comparator<String>() {
  3.  @Override
  4.  public int compare(String o1, String o2) {
  5.  Integer l1 = o1.length();
  6.  Integer l2 = o2.length();
  7.  return l1.compareTo(l2);
  8.  }
  9.  });

只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个 匿名内部类 的比较器对象然后将其传递给sort方法。在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

  1.  List<String> strs = Arrays.asList("a","avgdeqegtrq","gcs","qwrgreqwh","hgtyu","qwerrtyuhjgfd","ghjkuyt");
  2.  Collections.sort(strs,(String o1,String o2)->{
  3.  Integer l1 = o1.length();
  4.  Integer l2 = o2.length();
  5.  return l1.compareTo(l2);
  6.  });

可读性变强了,但是实际上还可以写得更短(省略参数类型):

  1.  List<String> strs = Arrays.asList("a","avgdeqegtrq","gcs","qwrgreqwh","hgtyu","qwerrtyuhjgfd","ghjkuyt");
  2.  Collections.sort(strs,( o1, o2)->{
  3.  Integer l1 = o1.length();
  4.  Integer l2 = o2.length();
  5.  return l1.compareTo(l2);
  6.  });

运行结果都为: 

对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,将代码写的更短,例如(这里就不按照字符串长度排序了):

  1.  List<String> strs = Arrays.asList("a","avgdeqegtrq","gcs","qwrgreqwh","hgtyu","qwerrtyuhjgfd","ghjkuyt");
  2.  Collections.sort(strs,(o1,o2)->o1.compareTo(o2));

__总结: 
1.如果形参列表是空的,只需要保留()即可; 
2.如果没有返回值,只需要在{}写执行语句即可; 
3.如果接口的抽象方法只有一个形参,()可以省略,只需要写一个参数名称即可; 
4.如果执行语句只有一行,可以省略{},但是如果有返回值的时候不能省略。

原理: Java编译器可以根据要传递的对象或者左边对象类型自动推导出参数类型,所以你可以不用再写一次类型,适用于只有单接口方法的接口(比如这里的排序,线程等...)__

三:函数式接口

  1.  是指仅仅只包含一个抽象方法的接口,可以添加 @FunctionalInterface 注解约束,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的,当然里面可以包含default方法和static方法。

例如:

  1. @FunctionalInterface
  2. public interface DefaultFunctionInterface {
  3.  void sayHello(String name);
  4.  public static void main(String[] args){
  5.  DefaultFunctionInterface df = name->System.out.println("hello===>"+name);
  6. df.sayHello("Bruce");
  7.  }
  8.  }

Jdk9新特性

jdk9 ea版本(early access 抢先版),下载地址:http://jdk.java.net/9/

一:JShell

JShell : 其实就是一个命令行工具,安装完JDK9后,可以在bin目录下找到该工具,与Python的解释器极其相似,用过Python解释器的人应该会非常熟悉。它可以让你体验交互式编程,有一些比较有趣的特性: 
实战:  
在jdk9安装目录的bin下面打开命令行工具,直接输入jshell进入jshell。 
直接输入代码:System.out.println("Hello World"); 回车执行.输出"Hello World". 
创建方法:void hello(){System.out.println("Hello 货车帮!");} 
计算:输入1+1回车执行输出计算结果. 存储了一个临时变量,可以声明一个变量,利用这个临时变量给声明的变量赋值.

  1.  JShell除了可以作为单独的JDK工具,还可以创建类,为这个类写方法,还可以提供一个API,它能对外部调用开放所有的功能。这意味着外部工具可以连接并使用JShell的功能,如此一些很有趣的可能性突然就被开发了出来,比如在Eclipse、IntelliJ或Netbeans之类的IDE中引用它。对于该API可能还有更多创造性的用例,例如利用该API来扩展静态分析的工具,自动化测试或者甚至是连接到实时的JVM。

二:集合工厂方法(试了9ea版本好像还不行):

通常,您希望在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法,除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现:

  1. Set<Integer> ints = Set.of(1, 2, 3);
  2. List<String> strings = List.of("first", "second");

三:其他的一些新特性: 自带JSON API,升级HttpURLConnection(相当于自带httpclient) 和 modules(平台级模块系统)

.......

JDK 新特性的更多相关文章

  1. JDK新特性关于流操作部分

    // array 工具类 可以用来快捷的将数组转化为list List<String> strings = Arrays.asList("zhongguo", &quo ...

  2. JavaEE基础(二十七)/反射、JDK新特性

    1.反射(类的加载概述和加载时机) A:类的加载概述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载  就是指将class文件读入 ...

  3. day27(027-反射&JDK新特性)

    ###27.01_反射(类的加载概述和加载时机) A:类的加载概述 *加载   就是指将class文件读入内存,并为之创建一个Class对象.任何类被使用时系统都会建立一个Class对象. *连接  ...

  4. 史上最全jdk新特性总结,涵盖jdk8到jdk15!

    前言 在本文中,我将描述自第8版以来Java最重要且对开发人员友好的功能.为什么会有这样的主意?在Web上,您可以找到许多文章,其中包含每种Java版本的新功能列表.但是,由于缺少文章,因此无法简要概 ...

  5. JAVA笔记 之 JDK新特性

    JDK1.5新特性1.泛型(Generics) 为集合(collections)提供编译时类型安全,无需每刻从Collections取得一个对象就进行强制转换(cast) 2.增强的for循环(for ...

  6. 第十四章 JDK新特性回顾

    14.1.JDK5新特性回顾 自动装箱.拆箱 静态导入 增强for循环 可变参数 枚举 泛型 元数据 14.2.JDK7新特性回顾 对Java集合(Collections)的增强支持 在switch中 ...

  7. JDK新特性——Stream代码简洁之道的详细用法

    一.概述 Stream 是一组用来处理数组.集合的API,Stream API 提供了一种高效且易于使用的处理数据的方式. Java 8 中之所以费这么大的功夫引入 函数式编程 ,原因有两个: 代码简 ...

  8. JDK新特性-Lambda表达式的神操作

    一.Lambda表达式的介绍 Lambda表达式是 Java8 中最重要的新功能之一.使用 Lambda 表达 式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看 起来更简洁易懂.Lambd ...

  9. Java(45)JDK新特性之String流

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201671.html 博客主页:https://www.cnblogs.com/testero ...

随机推荐

  1. 图像检索(4):IF-IDF,RootSift,VLAD

    TF-IDF RootSift VLAD TF-IDF TF-IDF是一种用于信息检索的常用加权技术,在文本检索中,用以评估词语对于一个文件数据库中的其中一份文件的重要程度.词语的重要性随着它在文件中 ...

  2. 【技术解析】如何用Docker实现SequoiaDB集群的快速部署

    1. 背景 以Docker和Rocket为代表的容器技术现在正变得越来越流行,它改变着公司和用户创建.发布.运行分布式应用的方式,在未来5年将给云计算行业带来它应有的价值.它的诱人之处在于: 1)资源 ...

  3. nginx系列14:对HTTP协议的反向代理proxy模块

    proxy_pass指令 URL参数规则 需要注意的是,url中携带和不携带URI时发往上游请求的行为不同!

  4. es6 for of 循环

    es6 新增了 for of 循环,只要继承了Iterator 接口的数据集合都可以使用 for of 去循环 for of 循环,统一数据集合的循环方法,解决了forEach循环的不能使用break ...

  5. 用app.net Core搞掂多国语言网站

    Asp.net Core 中文文档很少,你可以看英文的,不过英文的也是说的有点乱.这篇文章是干货. 1. 配置好你的WebApplication,使他可以支持国际化语言,修改文档Startup.cs ...

  6. java 线程池 ---- newCachedThreadPool()

    class MyThread implements Runnable{ private int index; public MyThread(int index){ this.index = inde ...

  7. 教你一招 | 用Python实现简易可拓展的规则引擎

    做这个规则引擎的初衷是用来实现一个可序列号为json,容易拓展的条件执行引擎,用在类似工作流的场景中,最终实现的效果希望是这样的: 简单整理下需求 执行结果最终返回=true= or false 支持 ...

  8. selenium-webdriver的二次封装(十)

    接着上篇随笔 selenium-配置文件定位元素 ,进行了配置文件设置后,将配置文件运用到定位元素中 思路:拿到定位的 key 和 value 后,对 webdrvier 中定位进行封装,使可以直接运 ...

  9. mysql之limit使用

    在mysql中,limit的使用方式如下: limit m,n --m:表示从哪一行开始查,n:查询多少条 需要明确的是,m表示取条数的起始位置,而n表示取多少条.例如我查询某个表,获取第一条数据,那 ...

  10. shader高级纹理学习总结

    最近看了shader的高级纹理 做个总结 复习! shader迟早是要拿下的