Lambda表达式
lambda 表达式的语法格式如下:
(parameters) -> expression或(parameters) ->{statements; }
以下是lambda表达式的重要特征:
· 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
· 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
· 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
· 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
Lambda 表达式主要用来定义行内执行的方法类型接口
Lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在lambda 内部修改定义在域外的局部变量,否则会编译错误。
Lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有final 的语义)
方法引用
-
构造器引用:
必须是无参的。语法是Class::new,或者更一般的Class< T >::new,要求构造器方法是没有参数;Java编译器会自动根据Factory.create方法的签名来选择函数。
Car car = Car.create(Car::new);//相当于new了一个Car
-
静态方法引用:
静态方法引用:它的语法是Class::static_method,实例如下:
直接::写就行
cars.forEach(Car::collide);
-
特定类的任意对象的方法引用:
特定类的任意对象的方法引用:它的语法是Class::method实例如下:
不用实例化,是这个类就行
//这个方法没有参数,什么类都能用 cars.forEach(Car::repair);
-
特定对象的方法引用:
特定对象的方法引用:它的语法是instance::method实例如下:
即必须先实例化。具体话到某个对象了(方法有形参)
final Car police = Car.create(Car::new);//先new cars.forEach(police::follow);//再调
函数式接口
@FunctionalInterface
//那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的)
通过lambda表达式可以直接实现函数式接口
-
接口默认方法
默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个default关键字即可实现默认方法。
他们的目的是为了解决接口的修改与现有的实现不兼容的问题。
public interface vehicle { default void print() { System.out.println("我是一辆车!"); } }
如果一个类继承了多个接口(都有默认方法怎么办呢)
1.自己重写方法
2.还是要重写不过通过调用指定的默认方法也行。 放发内部写表达式: 某一个接口.super.默认方法()
-
Java 8 的另一个特性是接口可以声明(并且可以提供实现)静态方法。
调用接口静态方法,直接 super.静态方法名 就行
public class Java8Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
}
}
interface Vehicle {
default void print() {
System.out.println("我是一辆车!");
}
static void blowHorn() {
System.out.println("按喇叭!!!");
}
}
interface FourWheeler {
default void print() {
System.out.println("我是一辆四轮车!");
}
}
class Car implements Vehicle, FourWheeler {
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("我是一辆汽车!");
}
}
Stream API
Java 8 API添加了一个新的抽象称为流Stream,
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象.
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。4大管道技术:
-
生成流
在Java 8中,集合接口有两个方法来生成流:
stream() −为集合创建串行流。
parallelStream() − 为集合创建并行流。
-
forEach
-
distinct
-
map
-
filter
-
limit
-
sorted
-
collect(Collectors.***())
-
mapToInt
-
summaryStatistics();
Optional 类
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - 允许传递为 null 参数
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// Optional.isPresent - 判断值是否存在
System.out.println("第一个参数值存在: " + a.isPresent());
System.out.println("第二个参数值存在: " + b.isPresent());
// Optional.orElse - 值不存则在返回括号默认值
Integer value1 = a.orElse(new Integer(0));
//Optional.get - 获取值,值需要存在
Integer value2 = b.get();
return value1 + value2;
}
}
还有很多其他方法
日期时间API
Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。
Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:
-
Local(本地) − 简化了日期时间的处理,没有时区的问题。
-
Zoned(时区) − 通过制定的时区处理日期时间