java SE8重要性能:
- Lambda
- Nashorn JavaScript引擎
- 新的日期与时间API
- 一套简洁的配置文件
- 从JVM中去除了永久代
- 增强的注解功能
接口
- 增加了default方法 和 static方法 都可以有方法体
- default 方法属于实例,static方法属于(接口)
- 接口里面的静态方法不会被继承,静态变量会被继承
- 一个类实现多个接口,且这些接口互相之间没有继承关系,会报错。
有继承关系,子接口会重写父接口的同名方法 - 有多个继承,有相同方法,实现类中可以通过特殊的语法指定要访问哪个接口的方法,在实现类中重写默认方法,在方法里面写
<接口>.super.<方法名>
interface InterTest1 {
static void test1(){
System.out.println("接口静态方法执行。。。");
}
default void test2(){
System.out.println("接口InterTest1默认方法执行。。。");
}
}
interface InterTest2{
default void test2(){
System.out.println("接口InterTest2默认方法执行。。。");
}
}
class InterMainTest implements InterTest2,InterTest1{
@Override
public void test2() {
InterTest2.super.test2();
}
}
- 如果接口只有一个方法,接口是一个函数式接口,可以使用lambda表达式。
- 如果接口里面使用@FunctionalInterface 注解,限定接口里面只能有一个抽象方法。
@FunctionalInterface
interface InterTest{
void test1();
}
Lambda表达式
函数式接口
当接口里面只有一个抽象方法时,就是函数式接口,可以使用@FunctionalInterface注解强制限定接口只能有一个抽象方法
注解:从java5开始引入注解,利用注解对字节码文件进行一些说明
lambda表达式只能对函数式接口使用
Lambda表达式语法
- 参数列表 ()
- 箭头符号“->”
- 代码块 {}
package top.yuzktyu.java8.lambda;
/*
* @author yuzk
* @date 2018年10月27日 下午3:56:43
* @version 1.0
*/
public class LambdaTest {
public static void main(String[] args) {
// 匿名内部类方法
LambdaInterface li = new LambdaInterface() {
public void test(){
System.out.println("匿名内部类实现");
}
};
li.test();
// lambda 表达式实现
LambdaInterface li2 = () ->{
System.out.println("使用Lambda表达式实现");
};
li2.test();
// lambda 表达式简便方法
// 方法体只有一句话 可以省略大括号 以及省略一个分号
// 如果有返回值 return 也能省略
LambdaInterface li3 =()-> System.out.println("使用Lambda表达式简便方法实现");
li3.test();
// 有参数
// 参数不需要知道数据类型
LambdaInterface2 li21 = (x)->{
System.out.println("一个参数输出参数"+x);
};
li21.test(6);
// 简便方法 参数列表只有一个参数 可以省略圆括号
LambdaInterface2 li22 = x-> System.out.println("一个参数输出参数简便方法"+x);
li22.test(6);
LambdaInterface3 li31 = (i,j)->{
System.out.println("两个参数"+i+"..."+j);
};
li31.test(5, 5);
// 有返回值的方法
LambdaInterface4 li41 = (b)->{
b=b+10;
return b;
};
System.out.println(li41.test(30));
// 简便方法
LambdaInterface4 li42 = b-> b+10;
System.out.println(li42.test(10));
}
}
// 没有参数没有返回值
interface LambdaInterface{
void test();
}
// 一个参数 没有返回值
interface LambdaInterface2{
void test(int i);
}
// 两个参数 没有返回值
interface LambdaInterface3{
void test(int i,int j);
}
// 一个参数 有返回值
interface LambdaInterface4{
int test(int i);
}
函数参数
package top.yuzktyu.java8.lambda;
import com.sun.org.apache.regexp.internal.recompile;
/*
* @author yuzk
* @date 2018年10月27日 下午4:37:48
* @version 1.0
*/
public class LambdaReturnTest {
void re(LambdaReturn lr){
int i = lr.test();
System.out.println("返回值"+i);
}
public static void main(String[] args) {
LambdaReturnTest lrt = new LambdaReturnTest();
lrt.re(()->{return 14;});
lrt.re(()->14);
}
}
interface LambdaReturn{
int test();
}
Stream流
- Stream 在java8中被定义为泛型接口
- Stream 接口代表数据流
- Stream 不是一个数据结构,不直接存储数据
- Stream 通过管道操作数据
- 创建Stream 接口实现类对象
Stream<Person> stream = people.stream();
创建一个元素为Person的集合:people 使用Stream和forEach 显示该集合所有元素。
public class StreamTest {
static List<Person> createPeople(){
List<Person> list = new ArrayList<>();
Person p1 = new Person("张飞",48,Person.Sex.MAIL,1.8);
Person p2 = new Person("刘备",32,Person.Sex.MAIL,1.7);
Person p3 = new Person("关羽",45,Person.Sex.MAIL,1.9);
Person p4 = new Person("诸葛亮",34,Person.Sex.MAIL,1.6);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
return list;
}
public static void main(String[] args) {
List<Person> people = createPeople();
Stream<Person> stream = people.stream();
stream.forEach(p->System.out.println(p.toString()));
}
}
管道
- 管道代表一个操作序列
- 管道包含以下组件
- 数据集 :可能是集合、数组等
- 零个或多个中间业务。如过滤器
- 一个终端操作,如 forEach
过滤器
- 过滤器:用给定的条件在源数据基础上过滤出新数据,并返回一个Stream对象。
- 过滤器包含匹配的谓词。
- 例如:判断p对象是否为男性的lambda表达式:
Stream<Person> stream = people.stream(); stream = stream.filter(p->p.getGender()=='男');
创建一个元素为Person的集合:people 使用Stream和forEach 显示该集合所有元素。
public class FilterTest {
public static void main(String[] args) {
List<Person> people = createPeople();
people.stream()
.filter(p->p.getGender()==Person.Sex.FEMALE)
.forEach(p->System.out.println(p));
}
static List<Person> createPeople(){
List<Person> list = new ArrayList<>();
Person p1 = new Person("张飞",48,Person.Sex.MAIL,1.8);
Person p2 = new Person("刘备",32,Person.Sex.MAIL,1.7);
Person p3 = new Person("关羽",45,Person.Sex.MAIL,1.9);
Person p4 = new Person("小乔",34,Person.Sex.FEMALE,1.6);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
return list;
}
}
DoubleStream接口
- DoubleStream接口表示元素类型是double的数据源
- DoubleStream的常用方法
- streammax().getAsDouble():获取流中数据集的最大值
- stream.min().getAsDouble():获取流中数据集的最小值
- stream.average().getAsDouble(): 获取流中数据集的平均值
list.stream()
.filter(p->p.get*==*)
.mapToDouble(p->p.get*)
.average()
.getAsDouble();