Java8特性
Lambda表达式
允许把函数作为一个方法的参数,将函数作为参数传递到方法中。
本质:函数式接口的实例,给接口提供一个实现类的对象时用到lambda表达式,要求接口只有一个抽象方法。
以前用匿名实现类表示的,现在都可以用Lambda表达式来写。
语法说明 -> lambda 操作符 左边: lambda 形参列表,接口中的抽象方法的形参列表。参数类型可以省略,只有一个参数可以省略括号 右边: lambda 体,重写的抽象方法体。如果只有一条执行语句,可以省略大括号、return。
注意: 1.用来定义行内执行的方法类型接口。 2.免去了使用匿名方法的麻烦。
1 2 3 4 5 6 7 8 9 10 11 12
| Runnable r2 = () -> System.out.print();
Runnable r2 = (String x) -> {System.out.print(x);}
Runnable r2 = (x) -> {System.out.print(x);}
Runnable r2 = x -> {System.out.print(x);}
Comparator<Integer> com = (x,y)->{return Integer.compare(x,y);}
Comparator<Integer> com = (x,y)->Integer.compare(x,y);
|
函数式接口
有且仅有一个抽象方法,但可以有很多非抽象方法的接口。
之前用匿名实现类的表示,现在都可以用lambda表达式来写。
内置函数式接口
- 消费型 Comsumer,包含
void accept(T t);
- 供给型接口 Supplier,包含
T get();
- 函数型接口Function<T,R>,包含
R apply(T t);
- 断言型接口Predicate,包含
boolean test(T t);
方法引用
当要传递给Lambda体的操作,已经有实现的方法,可以使用方法引用。
本质上还是Lambda表达式,作为函数式接口的实例。
使用格式:类(或对象)::方法名
1 2 3 4 5 6 7 8 9
| Comsumer<String> con = System.out :: println; con.accept(String);
Comparator<Integer> com = Integer :: compare; com.compare(T1,T2);
Comparator<Integer> com = String :: compareTo; com.compare(T1,T2);
|
构造器引用
和方法引用类似,函数式接口的抽象方法的形参列表和构造器参数列表一致。
抽象方法的返回值类型即为构造器所属的类的类型。
Class::new
Stream API
把函数式编程运用到Java,可以对集合数据进行操作。 Stream不会存储数据,会返回一个持有结果的新Stream。
步骤:创建Stream对象、中间操作、终止操作。
创建对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
List <Employee> employees = EmployeeData.getEmployees(); Stream <Employee> stream = employees.stream();
Stream <Employee> parallelStream = employees.parallelStream();
int[] arr = new int[]{1,2}; IntStream stream = Arrays.stream(arr);
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
|
中间操作
- 筛选与切片
1 2 3 4 5 6 7 8
| stream.filter(Predicate p)
stream.limit(n);
stream.skip(n);
stream.distinct();
|
- 映射
1 2 3 4 5
| stream.map(Function f);
stream.flatmap(Function f);
|
- 排序
1 2 3 4
| stream.sorted();
stream.sorted(Comparable com);
|
终止操作
- 匹配与查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
allMatch(Predicate p);
anyMatch(Predicate p);
noneMatch(Predicate p);
findFirst();
findAny();
count();
max(Comparator c);
min(Comparator c);
|
- 规约
1 2 3
| reduce(T identity, BinaryOperator); reduce(BinaryOperator);
|
- 收集
Optional类
optional是一个容器类,可以保存类型T的值,代表值存在。保存null代表值不存在,可以避免空指针异常。
1 2 3 4 5 6 7 8 9 10 11
| Optional.of(T t); Optional.empty(); Optional.ofNullalbe(T t);
boolean isPresent(); void ifPresent(Consumer <?super T> consumer);
T get(); T orElse(T other);
|
默认方法
接口可以有实现方法,而且不需要实现类去实现其方法。