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);    

 

 



posted @ 2017-12-30 21:18  heapStark  阅读(364)  评论(0编辑  收藏  举报