zoukankan      html  css  js  c++  java
  • JDK 8

    Java SE 8 在 Java 语言层面上新增了 lambda expression 的功能,使得 Java 具备了函数式语言的能力 - 可以将函数作为方法参数传递,即 code as data。
    JDK 8 ( Oracle 对 Java SE 8 的实现 ) 新增了 java.util.stream , method reference , functional interface,这些都与 lambda expression 密切相关。
    • java.util.stream 使得我们可以将 collection 视作 stream。stream 不是 data structure,不存储数据,它仅仅向我们提供了 collection 的另外一种视角 ( view )。我们可以通过一系列的 aggregate operations 构成的 pipeline 操作 stream 。
    • method reference 可以在 lambda expression 出现的地方使用,代替 lambda expression,据官方说明这样更清晰易懂。
    • functional interface 是只含有一个 abstract method 的 interface ( 可以包含 default method,static method。注意:定义了 Object 中同名的方法不算 abstract method ) 。JDK 8 中新增了很多通用的 functional interface,可以用 lambda expression 实现。
    Java Tutorial 介绍了 method reference,说它一共有四种形式:
     
    Kind
    Example
    Reference to a static method
    ContainingClass::staticMethodName
    Reference to an instance method of a particular object
    containingObject::instanceMethodName
    Reference to an instance method of an arbitrary object of a particular type
    ContainingType::methodName
    Reference to a constructor
    ClassName::new
     
     
    但是,官方文章也没有讲清第二三种方式的区别。
     
    第二种方式适用的情况是:方法调用者不是传进来的参数。
     1 class ComparisonProvider {
     2     public int compareByName(Person a, Person b) {
     3         return a.getName().compareTo(b.getName());
     4     }
     5         
     6     public int compareByAge(Person a, Person b) {
     7         return a.getBirthday().compareTo(b.getBirthday());
     8     }
     9 }
    10 ComparisonProvider myComparisonProvider = new ComparisonProvider();
    11 Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
    compareByName 将传进来的两个参数全部作为参数。

    第三种方式适用的情况是:方法调用者是传进来的第一个参数。
    1 String[] stringArray = { "Barbara", "James", "Mary", "John",
    2     "Patricia", "Robert", "Michael", "Linda" };
    3 Arrays.sort(stringArray, String::compareToIgnoreCase);
    compareToIgnoreCase 的调用者是传进来的第一个参数。

    第三种方式有点费解,个人认为不如用 lambda expression 来得简洁易懂、不易出错。

    参考资料:

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html。

     
     
     
  • 相关阅读:
    【转】VC 隐藏模块、MFC 改变窗口类名
    【转】Reason: The specified virtual disk needs repair.
    关于CreateProcess函数一些经验
    利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态
    uefi安装win7,deepin15双系统后grub没有windows选项
    X64下的虚拟地址到物理地址的转换
    WinDBG 技巧:列出模块(DLL/EXE)里面所有的符号(symbol)
    windows7内核分析之x86&x64第二章系统调用
    使用VS Code写PHP并进行调试
    使用CreateProcess创建新的process 并返回process运行结束返回值
  • 原文地址:https://www.cnblogs.com/huangzejun/p/9487267.html
Copyright © 2011-2022 走看看