Java新特性特点
●速度更快
●代码更少(增加了新的语法Lambda表达式)
●强大的Stream API
●便于并行
●最大化减少空指针异常Optional
1.Lambda表达式
●Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
●为引入Lambda表达式,Java8新增了java.util.funcion包,里面包含常用的函数接口,这是Lambda表达式的基础,Java集合框架也新增部分接口,以便与Lambda表达式对接。lambda表达式本质上是一段匿名内部类,也可以是一段可以传递的代码
接口名 | Java8新加入的方法 |
---|---|
Collection | removeIf() spliterator() stream() parallelStream() forEach() |
List | replaceAll() sort() |
Map | getOrDefault() forEach() replaceAll() putIfAbsent() remove() replace() computeIfAbsent() computeIfPresent() compute() merge() |
这些新加入的方法大部分要用到java.util.function包下的接口
2.函数式接口
① 什么是函数式接口
●如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上。
●@Functionallnterface 注解检测接口是否符合函数式接口。
@FunctionalInterface
public interface usb {|
vpid service();
}
public class Demo{
public static void mian(String[]args){
Usb mouse=new Usb(){
@Override
public void service(){
System.out.print1n("输出语句");
}
};
Usb fan=()->System.out.println("输出语句");
run(mouse);
run(lfan);
}
public static void run(Usb usb) {
usb.service();
}
}
② 常见函数式接口
3.方法引用与构造器引用
•方法引用是Lambda表达式的一种简写形式。如果Lambda表达式方法体中只是调用一个特定的已经存在的方法,则可以使用方法引用。
常见格式
•对象::实例方法
•类::静态方法
•类::实例方法(lambda参数列表中第一个参数是实例方法的调用 者,第二个参数是实例方法的参数时可用)
•类::new
对象::实例方法
Consumer<string> consumer=s->System.out.println(s);
consumer.accept("hello");
Consumer<string> consumer2=System.out::println;
consumer.accept("world");
类::静态方法
Comparator<Integer> sum1=(a,b)->Integer.compare(a, b);
Comparator<Integer> sum2=Integer::compare;
类::实例方法
Function<Employee, String> function=s->s.getName();
Function<Employee, String> function2=Employee:igetName;
System.out.println(function2.apply(new Employee("张三", 99999)));
类::new
Supplier<Employee> supplier=()->new Employee();
Supplier<Employee> supplier2=Employee::new;
Employee employee=supplier.get();
system.out.println(employee.tostring());
4.Stream API
什么是Stream
流(Stream)中保存对集合或数组数据的操作。和集合类似,但集合中保存的是数据。
Stream的特点
●Stream 自己不会存储元素。
●Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
●Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
创建Stream
●创建
新建一个流
●中间操作
在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作
●终止操作
使用一个终止操作来产生一个结果。该操作会强制它之前的延迟操作立即执行。在这之后,该Stream就不能使用了。
中间操作
代码 | 作用 |
---|---|
filter | 过滤 |
limit | 限制 |
skip | 跳过 |
distinct | 去重 |
sorted | 排序 |
终止操作
代码 | 作用 |
---|---|
foreach | 对数据便利操作 |
max | 最大值 |
min | 最小值 |
count | 计算 |
reduce | 求和 |
collect | 收集 |
5.接口中的默认方法与静态方法
默认方法
#接口默认方法的”类优先”原则#
若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时
●选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
●接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突
在接口中可以使用default和static关键字来修饰接口中定义的普通方法
public interface Interface {
default String name1(){
return "zhangsan";
}
static String name2(){
return "wangwu";
}
}
在JDK1.8中很多接口会新增方法,为了保证1.8向下兼容,1.7版本中的接口实现类不用每个都重新实现新添加的接口方法,引入了default默认实现,static的用法是直接用接口名去调方法即可。当一个类继承父类又实现接口时,若后两者方法名相同,则优先继承父类中的同名方法,即“类优先”,如果实现两个同名方法的接口,则要求实现类必须手动声明默认实现哪个接口中的方法。
6.新时间日期API
本地化日期时间API
代码 | 注释 |
---|---|
LocalDate | 日期 |
LocalTime | 时间 |
LocalDateTime | 日期和时间 |
//创建本地时间
LocalDateTime localDateTime=LocalDateTime.now();
//LocalDateTime localDateTime2=LocalDateTime.of(year, month, dayofMonth, hour, minute)
System.out.println(localDateTime);
System.out.println(localDateTime.theYear());
System.out.println(localDateTime.theMonthValue());
System.out.println(localDateTime.theDayofMonth());
Instant:时间戳
//创建Instant:时间戳
Instant instant=Instant.now();
System.out.println(instant.toString());
System.out.println(instant.toEpochMilli());
System.out.println(System.currentTimeMillis());
ZoneId:时区
//创建zoneId:时区
Set<string> availableZoneIds = ZoneId.getAvailableZoneIds();
for (String string : availableZoneIds){
system.out.print1n(string);]
7.总结
1.Java8为容器新增一些有用的方法,这些方法有些是为完善原有功能,有些是为引入函数式编程,学习和使用这些方法有助于我们写出更加简洁有效的代码。
2.函数接口虽然很多,但绝大多数时候我们根本不需要知道它们的名字,书写Lambda表达式时类型推断帮我们做了一切。