Java8 新特性
新特性
- Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。
- 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
- 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
- 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
- Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
- Date Time API − 加强对日期与时间的处理。
- Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
- Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
Lambda表达式
/**
* Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
* Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
* 使用 Lambda 表达式可以使代码变的更加简洁紧凑。
*/
public class LambdaDemo {
public static void main(String[] args) {
// 不使用Lambda
IAction iAction0 = new IActionImpl();
iAction0.exec("0","A");
// 使用匿名内部类
IAction iAction1 = new IAction() {
@Override
public boolean exec(String name, String type) {
System.out.println("exec......"+name+"......"+type);
return false;
}
};
iAction1.exec("1", "B");
// 使用Lambda表达式
IAction iAction2 = (String name,String type) -> {
System.out.println("exec......"+name+"......"+type);
return false;
};
iAction2.exec("L2", "LC");
/**
* 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
* 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
* 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
* 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
*/
IAction iAction3 = (name,type) -> true;
boolean exec3 = iAction3.exec("L3", "LD");
System.out.println("L3-----返回:"+exec3);
}
}
// 接口中有且只有一个方法
interface IAction{
public boolean exec(String name,String type);
}
class IActionImpl implements IAction{
@Override
public boolean exec(String name, String type) {
System.out.println("exec......"+name+"......"+type);
return false;
}
}
Stream
Stream(流)是一个来自数据源的元素队列并支持聚合操作
- 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;
public class StreamDemo {
public static void main(String[] args) {
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd",null, "jkl");
/**
* 创建流的两个方法
* stream() − 为集合创建串行流。
* parallelStream() − 为集合创建并行流。
*/
// filter条件过滤出元素 过滤掉为null或空的对象
List<String> filtered = strings.stream().filter(string -> string!=null&&!string.isEmpty()).collect(Collectors.toList());
// forEach迭代流中的数据
filtered.stream().forEach(System.out::println);
// map映射每个元素对应的结果
filtered.stream().map(str->"Map映射数据:"+str).forEach(System.out::println);
// limit获取指定数量的流
filtered.stream().limit(2).map(str->"limit获取指定数量的流--1:"+str).forEach(System.out::println);
filtered.stream().limit(2).map(str->"limit获取指定数量的流--2:"+str).forEach(System.out::println);
// sorted对流进行排序
filtered.stream().sorted().map(str->"sorted对流进行排序:"+str).forEach(System.out::println);
// 使用parallel并行流获取空串数量 考虑元素为null报错情况
long count = strings.parallelStream().filter(string -> string!=null).filter(string -> string.isEmpty()).count();
System.out.println("用parallel并行流获取空串数量:"+count);
// Collectors归纳操作
strings.stream().filter(string -> string!=null&&!string.isEmpty()).collect(Collectors.toList());
String mergedString = strings.stream().filter(string -> string!=null&&!string.isEmpty()).collect(Collectors.joining(", "));
System.out.println("合并字符串: " + mergedString);
// 统计
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());
}
}