• 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);    
    
    
    
    
  • 相关阅读:
    将抓包工具证书从用户目录移动至系统目录,解决反爬对于本地证书认证(安卓7)
    《C++ concurrency in action》 读书笔记 -- Part 2 第三章 线程间的数据共享
    《C++ concurrency in action》 读书笔记 -- Part 3 第四章 线程的同步
    C++14 也快要来了
    《C++ concurrency in action》 读书笔记 -- Part 4 第五章 C++的多线程内存模型 (1)
    利用表达式树构建委托改善反射性能
    使用Task简化Silverlight调用Wcf(再续)
    逆变与协变详解
    Beginning Silverlight 4 in C#数据访问和网络
    使用Task简化Silverlight调用Wcf(续)
  • 原文地址:https://www.cnblogs.com/heapStark/p/8151234.html
Copyright © 2020-2023  润新知