jdk1.8新特性知识点:
一、特殊的(函数式)接口
学习需知:
1.类的二个要素是什么?
属性和方法 属性三要素:(修饰符)类型,名字,值; 方法五要素:修饰符,返回值,方法名,形参(不是实际存在的变量),方法体;
2.接口:
接口是一个抽象的类 接口中的方法全部都是抽象的 接口可以有多个父接口 接口没有初始化块
接口类里的属性默认有修饰语publicstaticfinal 接口中的属性全部都是public static final
jdk1.8新特性: 在接口中的方法可以有方法体
3.什么是函数式接口?
简单来说就是只定义了一个抽象方法的接口(Object类的public方法除外),就是函数式接口,并且还提供了注解:@FunctionalInterface。
注意:该注解只能标在"有且仅有一个抽象方法"的接口上,如下
pacckge jdk.demo;
@FunctionalInterface
public interface TestInterface{
public void add();
}
3.特殊的接口和方法的调用
(1)特殊的接口——接口里有方法体
(2)可以使用::调用方法。
//构造方法引用使用方式:Class::new
look l=look.book(look::new);
//静态方法引用使用方式:Class::staticMethod
test.operate(1, 2, Test::add);
//对象的实例方法引用
test.operate(1, 2, test::sub);
//、类的实例方法引用;先满足实例方法,而非静态方法;Lambda表达式的第一个参数将成为调用实例的对象。
test.test(Test::testM);
二、什么是lambda表达式?
1.lambda表达式的特点是语法超级简洁,如下
//我们知道,对于一个Java变量,我们可以赋给其一个“值”。
int a=1;
String a="hello";
//如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?
//比如我要把如下代码赋给一个叫b的java变量
public void m(String a){
System.out.println(s);
}
//在java 8之前,这个是做不到的。但是Java 8问世之后,利用Lambda特性,就可以做到了
b=public void m(String a){
System.out.println(s);
}
//但是这样并不是一个简洁的写法,我们为了简洁可以移除一些没有用的声明。如:
b=public void m(String a){
System.out.println(s);
}
//的最简洁样式为
b=(a)→System.out.println(s);
/*原因:public 是多余的;函数名字是多余的,因为已经赋给了b;编译器可以自己判断返回类型和参数类型是什么
如果只有一行输出语句可以不要大括号,在参数和函数之间加上一个箭头符号
*/
//这样,我们就成功的非常优雅的把“一块代码”赋给了一个变量。而“这块代码”,或者说“这个被赋给一个变量的函数”,就是一个Lambda表达式。
2.匿名类:
(1)目标方法的参数得是一个接口; (2)方法的参数里面直接new后面跟上接口名 (3)必须马上写类体,重写方法体
3.lambda表达式的先决条件
(1)目标方法的参数是一个接口
(2)接口中只有一个抽象方法,这个抽象方法不是Object里面的方法
(3)接口最好顶一个注解:@FunctionalInterface
三、Stream
Stream概述
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
特点:
1 . 不是数据结构,不会保存数据。
2. 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:毕竟peek方法可以修改流中元素)
3. 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。
1.Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
2.Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式