以前接口中没有方法体,当要修改某个接口时,该接口的所有实现类必须实现该接口的方法
为解决这一问题,新加了默认方法----- 接口中可以存在方法体了,必须在方法前面用default修饰表示默认方法
public interface MyInterface {
void sayHello();
default void hello() { System.out.println("接口的默认方法"); }
}
接口中可以有任意多个默认方法,实现类不需要实现这些方法,但是可以重写这些方法。
一个类可以实现多个接口,且这些接口可以有相同的方法,不过这种情况下就必须要重写同名的默认方法。
在java8中接口可以声明静态方法和私有方法。
public interface MyInterface {
void sayHello();
default void hello() { System.out.println("接口的默认方法"); }
static void sleep() { System.out.println("zzzzz......"); }
static void jump() { System.out.println("i love jump!!"); }
public static void main(String[] args) {
MyInterface.sleep(); jump();
}
}
注意: 当一个类实现了两个拥有同一个默认方法的接口时必须重写该方法。
接口中的静态方法可以通过接口名直接调用
什么是函数式接口 ?
:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的
接口。
函数式接口可以被隐式转换为 lambda 表达式。
函数式接口的定义
:当接口里只有一个抽象方法的时候,就是函数式接口,可以使用注解(@FunctionalInterface)强制
限定接口是函数式接口,即只能有一个抽象方法。
@FunctionalInterface
public interface MyFunctionInterface {
public void sayHello();
default void sayHi() { System.out.println("Hi");}
}
函数式接口是整个Lambda表达式的一个根源,换句话来说java8中的Lambda表达式要想 彻底掌握,前提是要彻底理解好函数式接口
我们之前使用过的Runabel、Comparator等就是函数式接口
java8新增了许多函数式接口,在java.util.function包下。它包含了很多类,用来支持 Java 的函数式编程,该包中的函数式接口有非常多,先列举几种:
接口 | 描述 |
---|---|
Consumer | 代表了接受一个输入参数并且无返回的操作,常用于生产数据的场景 |
Supplier | 无参数,返回一个结果。常用于消费数据的场景 |
Function |
接受一个输入参数,返回一个结果。常用于类型转换的场景 |
Predicate | 接受一个输入参数,返回一个布尔值结果。常用于条件判断的场景 |
更多内容请查阅资料… |
简化内部类的操作 用Lambda表达式实现的类不会产生class文件
无参无返回 ,一行
无参无返回,多行要加大括号
public class Lambda {
public static void main(String[] args) {
QQ q=()->System.out.println("加油");
q.bos();
}
}
@FunctionalInterface
interface QQ{
void bos();
}
有参,有返回 一行可以不可以有return
有参,有返回 多行 用大括号 要return
public class Lambda {
public static void main(String[] args) {
QQ q=(a)->a;
System.out.println(q.bos(10));
}
}
@FunctionalInterface
interface QQ{
int bos(int a);
}
Lambda的特征
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表
达式返回了一个数值。
泛型方法 要写数据类型
当方法中只有一条语句时 才可以使用
什么是Stream ?
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的
高阶抽象。
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本
的 Iterator。
原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,
用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个
字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。
Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽
了,就好比流水从面前流过,一去不复返。
使用stream
流操作分为4大类
初始**/转换(init)、媒介(Intermediate)、末端(Terminal)、短路(Short-circuiting)**
生成流,Java中的Stream的所有操作都是针对流的,所以,使用Stream必须要得到
Stream对象
Collection.stream() − 为集合创建串行流
Collection.parallelStream() − 为集合创建并行流。
Arrays.stream(T array) 或者 Stream.of() -自定义创建流数据
1**、初始化一个流:**
Stream stream = Stream.of(“a”, “b”, “c”);
2**、数组转换为一个流:**
String [] strArray = new String[] {“a”, “b”, “c”};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
3**、集合对象转换为一个流:**
List list = Arrays.asList(strArray);
stream = list.stream();
LocalDate、LocalTime 、 LocalDateTime
该包的API提供了大量相关的方法,这些方法一般有一致的方法前缀,代表着特定的功能
of:静态工厂方法,用于自定义日期。
parse:静态工厂方法,关注于解析。
get:获取某些东西的值。
is:检查某些东西的是否是true。
with:不可变的setter方法。
plus:加一些量到某个对象。
minus:从某个对象减去一些量。
to:转换到另一个类型。
at:把这个对象与另一个对象组合起来,例如: date.atTime(time)。