Java8已经发布好久,是自java5(2004年发布)以后Oracle发布的最重要的一个版本。其中包括语言、编译器、库、工具和JVM等诸多方面的新特性,对于国内外互联网公司来讲,Java8是之后技术开发的趋势。这里主要讲解在开发中几个核心的新特性。(主要重新特性概念解释、语法定义、简单代码演示、优缺点分析、项目实战几个方面编写)。java
核心特性总览编程
接口默认方法框架
在注册网站时,咱们会在注册后使用网站提供的默认头像,应用程序安装成功后一般会提供默认图标,在电商网站购买过商品进行支付时,咱们会设置经常使用收货地址为默认地址,看起来生活中不少场景都有默认一说。Java8 开始,一样也有默认这个词的出现,这里针对接口Java8扩展了接口原有功能,并对默认方法提供支持。 ide
概念函数
从Java8开始,程序容许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。默认方法在接口中能够添加多个,而且Java8提供了不少对应的接口默认方法。工具
语法测试
Java8中接口能够包含实现方法,须要使用default修饰,此类方法称为默认方法。默认方法在接口中必须提供实现,在实现类中能够按需重写。默认方法只能在实现类中或经过实现类对象调用。以下形式:网站
public interface IMathOperation {
/**对象
简单使用排序
接口定义
定义IMathOperation 接口 并提供默认打印方法
public interface IMathOperation {
/**
子类实现
定义MathOperationImpl子类 实现IMathOperation 接口
子类在实现时,按需重写接口默认方法
public class MathOperationImpl implements IMathOperation {br/>@Override
public int add(int a, int b) {
// 子类中能够直接调用父类接口默认方法
IMathOperation.super.print();
// 调用父类静态默认方法
IMathOperation.version();
return a+b;
}
}
多个默认方法
使用Java8开发应用程序,子类实现多个接口时,对于接口默认方法定义容许定义多个默认方法,而且接口默认方法可能会出现同名状况,此时对于子类在实现或者调用时一般遵循如下原则:
1.类中的方法优先级最高
2.若是第一条没法进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即若是B继承了A,那么B就比A更加具体
示例代码以下:
/**
/**
/**
实现 Phone MiPhone 接口
*/
public class M2sPhone implements Phone,MiPhone {
public static void main(String[] args) {
new M2sPhone().info();
}
}
打印结果:
这是一部小米手机
接口静态方法
接口中除了容许定义多个默认方法以外,Java8也容许在接口中定义多个静态方法,静态方法即经过static 修饰的方法。接口中静态方法也必须提供实现,提供了能够直接经过接口调用方法的方式。
public interface IMathOperation {
/**
定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println("这是数值运算基本接口。。。");
}
/**
接口中的静态方法只能经过接口自己去调用,相似于 Class 中的静态方法,不存在默认方法中的多继承问题,静态方法并不能在实现类中被覆写,实现类中能够声明相同的方法,但这两个方法之间除了名字相同,并无 Override 关系。
接口默认方法实战
一、网站活跃TOP3用户遍历
这里以博客网站举例,好比统计每月网站前三活跃用户(按用户文章发表量评判),使用集合遍历操做来使用接口默认方法,对于测试数据以下:
uList= new ArrayList<>();
uList.add(new UserDto(35,"zs","126xxx@126.com",800,"lv4"));
uList.add(new UserDto(60,"js_li","157xxx@139.com",500,"lv3"));
uList.add(new UserDto(78,"fc_007","126@126.com",260,"lv2"));
加强for实现
获得统计集合数据后,最简单的方式使用加强for实现,也是java8以前经常使用的方式。
System.out.println("----------集合遍历-->原始遍历方法---------");
for(UserDto u:uList){
System.out.println(u);
}
自定义接口默认方法
/**
/**
}
/*
执行遍历
/
System.out.println("----------集合遍历-->自定义接口默认方法---------");
// 使用自定义的接口默认方法实现集合元素遍历
uList.myForeach(uList);
使用加强的Iterable接口默认方法
System.out.println("----------集合遍历-->加强的List接口默认方法---------");
uList.forEach(new Consumer<UserDto>() {br/>@Override
public void accept(UserDto userDto) {
System.out.println(userDto);
}
});
}
二、网站活跃TOP3用户排序
这里以博客网站举例,好比统计每月网站前三活跃用户(按用户文章发表量评判),使用集合排序操做来使用接口默认方法,对于测试数据以下:
Collections.sort 工具类方法实现排序
System.out.println("--------Collections.sort 实现按文章发表量排序---------");
Collections.sort(uList, new Comparator<UserDto>() {br/>@Override
public int compare(UserDto o1, UserDto o2) {
return o1.getTotal()-o2.getTotal();
}
});
uList.forEach(System.out::println);
加强的List接口默认sort方法
借助Java8加强的List接口默认Sort方法实现集合排序操做
System.out.println("--------集合默认sort方法实现按文章发表量排序---------");
uList.sort(new Comparator<UserDto>() {br/>@Override
public int compare(UserDto o1, UserDto o2) {
return o1.getTotal()-o2.getTotal();
}
});
uList.forEach(System.out::println);
Stream流sorted 方法实现排序(这里先作了解!)
Stream流提供了针对集合的多种操做,这里借助Stream的sorted实现集合元素排序操做,后续会对Stream作详细介绍。
System.out.println("--------Stream实现按文章发表量排序---------");
List<UserDto> result= uList.stream().sorted(new Comparator<UserDto>() {br/>@Override
public int compare(UserDto o1, UserDto o2) {
return o1.getTotal()-o2.getTotal();
}
}).collect(Collectors.toList());
result.forEach(System.out::println);
接口默认方法与静态方法的优点
一、接口的兼容性获得解决
使用接口编程的好处是,开发是面向抽象而再也不是面向具体来编程,使得程序变得很灵活,缺陷是,当须要修改接口时候,此时对应实现该接口的类须要所有修改,举个例子, java 8 以前对于咱们经常使用的集合框架没有 foreach 方法,一般能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。从Java8开始,引入了接口默认方法,这样的好处也是很明显的,首先解决了Java8之前版本接口兼容性问题,同时对于咱们之后的程序开发,也能够在接口子类中直接使用接口默认方法,而再也不须要再各个子类中各自实现响应接口方法。
二、子类在实现接口方法时灵活度更高
子类在实现接口时,能够按需重写,不在向Java8之前接口方法必须所有实现,同时接口默认方法能够在子类中直接进行调用,灵活度比较高。
三、开发中避免大量工具类建立
接口中引入静态方法,对于原有项目开发中出现大量的工具类大量静态方法的代码即可以迁移到接口中定义与实现,省去大量工具类的建立。
四、提高了对Lambda表达式的支持Lambda 是针对只有一个抽象方法的接口来讲的,接口中引入接口默认方法与静态方法,在对接口这些方法进行调用时,能够引入Lambda表达式简化了原有代码的书写形式,使得代码变得更加简洁。