lamdba表达式
jdk8提供了很多新特性,可以看作在语言层面1.5之后的最重要更新,提供的主要特性如下:
1.Lambda表达式
2.Stream函数式操作流元素集合
3.接口新增:默认方法与静态方法
4.方法引用,与Lambda表达式联合使用
5.引入重复注解
6.类型注解
7.最新的Date/Time API (JSR 310)
8.新增base64加解密API
9.数组并行(parallel)操作
10.JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)元空间
其中1,2,4都和lamdba表达式有关
关于lamdba表达式一个最简单的例子如下:
Thread thread = new Thread(() -> { System.out.println(this.getClass()); assert (this.getClass().getName()=="heapStark.blogCode.lambda.Main"); });
lamdba表达式的类型依赖上下文环境,lamdba表达式可以引用非final变量,但是,该变量事实上必须是final的,即无法再次赋值,因此lamdba表达式引用的是值而不是变量。
函数式接口:
函数接口是只有一个抽象方法的抽象接口,用作lamdba表达式的类型
fuuction包下提供了一系列函数式接口()
Predicate
boolean test(T t);
Supplier
T get();
Function
R apply(T t);
BiConsumer
void accept(T t, U u);
类型推断:
类似jdk7中的菱形操作符,javac根据lambda表达式的上下文就可以推断出参数的正确类型。
示例:Predicate表达式表示接受一个对象返回一个boolean类型的结果
Stream流:
一组获取Stream对象的方法:
//collect()及早求值
assert (list.stream().collect(Collectors.toList()).equals(list));
//map() R apply(T t);
assert (list.stream().map((a) -> a.toString()).collect(Collectors.toList()).equals(Arrays.asList("1", "2", "3")));
//filter() boolean test(T t);
assert (list.stream().filter(a->a>=2).collect(Collectors.toList()).equals(Arrays.asList( 2, 3)));
//flatMap() R apply(T t);
Stream<List<Integer>> streamInteger = Stream.of(Arrays.asList(1), Arrays.asList(2));
assert (streamInteger.collect(Collectors.toList()).equals(Arrays.asList(Arrays.asList(1), Arrays.asList(2))));
Stream<Integer> streamFlatMap = Stream.of(Arrays.asList(1), Arrays.asList(2)).flatMap(s -> s.stream());
assert (!streamFlatMap.equals(Stream.of(Arrays.asList(1, 2))));
assert (streamFlatMap.collect(Collectors.toList()).equals(Arrays.asList(1, 2)));
//max(),min() boolean test(T t);
assert (list.stream().max(Comparator.comparing(a->a)).get()==3);
assert (list.stream().min((a,b)->a-b).get()==1);
//reduce
assert (list.stream().reduce((a,b)->a+b).equals(6));
//对于延迟求值可以进行链式操作
通过Stream对基本类型进行高性能计算:
以long为例提供了两个基本的函数式接口
/** * 基本类型 */ Student student = new Student("wang", 1, new Date()); Student student1 = new Student("wang", 2, new Date()); Student student2 = new Student("wang", 3, new Date()); Stream<Student> streamStudent = Stream.of(student, student1, student2); IntSummaryStatistics statistics = streamStudent.mapToInt((a) -> a.getAge()).summaryStatistics(); assert (statistics.getMax() == 3); assert (statistics.getMin() == 1); assert (statistics.getSum() == 6); assert (statistics.getAverage() == 2);