• Lambda表达式和函数式编程


    Lambda表达式和函数式编程

      https://www.cnblogs.com/bigbigbigo/p/8422579.html

      https://www.runoob.com/java/java8-lambda-expressions.html

    函数接口是指内部只有一个接口函数的接口。

    一、Lambda表达式

    • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
    • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
    • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
    • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

    在Lambda表达式之前,新建一个线程这样写:

    new Thread(new Runnable(){
    @Override
    public void run(){
    System.out.println("Thread run()");
    }
    }).start();

    有Lambda表达式之后,则可以这样写:
    new Thread( () -> System.out.println("Thread run()") ).start();

    如上所示,Lambda表达式一个常见用法是取代(某些)匿名内部类,但Lambda表达式的作用不限于此。

    Runnable run = () -> System.out.println("Hello World");// 1
    ActionListener listener = event -> System.out.println("button clicked");// 2
    Runnable multiLine = () -> {// 3
    System.out.println("Hello ");
    System.out.println("World");
    };
    BinaryOperator<Long> add = (Long x, Long y) -> x + y;// 4
    BinaryOperator<Long> addImplicit = (x, y) -> x + y;// 5

    二、Lambda表达式和Stream

    Lambda表达式的另一个重要用法,是和Stream一起使用。
    Stream is a sequence of elements supporting sequential and parallel aggregate operations。
    Stream就是一组元素的序列,支持对这些元素进行各种操作,这些操作通过Lambda表达式指定。
    可以把Stream看作Java Collection的一种视图,
    就像迭代器是容器的一种视图那样(但Stream不会修改容器中的内容)。

    下面例子展示了Stream的常见用法。

    例子1
    假设需要从一个字符串列表中选出以数字开头的字符串并输出,Java 7之前需要这样写:

    List<String> list = Arrays.asList("1one", "two", "three", "4four");
    for(String str : list){
    if(Character.isDigit(str.charAt(0))){
    System.out.println(str);
    }
    }

    而Java 8就可以这样写:

    List<String> list = Arrays.asList("1one", "two", "three", "4four");
    list.stream()// 1.得到容器的Steam
    .filter(str -> Character.isDigit(str.charAt(0)))// 2.选出以数字开头的字符串
    .forEach(str -> System.out.println(str));// 3.输出字符串

    上述代码首先1. 调用List.stream()方法得到容器的Stream,2. 然后调用filter()方法过滤出以数字开头的字符串,3. 最后调用forEach()方法输出结果。

    使用Stream有两个明显的好处:

    减少了模板代码,只用Lambda表达式指明所需操作,代码语义更加明确、便于阅读。
    将外部迭代改成了Stream的内部迭代,方便了JVM本身对迭代过程做优化(比如可以并行迭代)。

    例子2
    假设需要从一个字符串列表中,选出所有不以数字开头的字符串,将其转换成大写形式,并把结果放到新的集合当中。Java 8书写的代码如下:

    List<String> list = Arrays.asList("1one", "two", "three", "4four");
    Set<String> newList =
    list.stream()// 1.得到容器的Stream
    .filter(str -> !Character.isDigit(str.charAt(0)))// 2.选出不以数字开头的字符串
    .map(String::toUpperCase)// 3.转换成大写形式
    .collect(Collectors.toSet());// 4.生成结果集

    上述代码
    1.调用List.stream()方法得到容器的Stream
    2.调用filter()方法选出不以数字开头的字符串
    3.调用map()方法将字符串转换成大写形式
    4.调用collect()方法将结果转换成Set。
    这个例子还向我们展示了方法引用(代码标号3处)以及收集器(代码标号4处)的用法


    通过这个例子我们看到了Stream链式操作,即多个操作可以连成一串。不用担心这会导致对容器的多次迭代,因为不是每个Stream的操作都会立即执行。Stream的操作分成两类,一类是中间操作(intermediate operations),另一类是结束操作(terminal operation),只有结束操作才会导致真正的代码执行,中间操作只会做一些标记,表示需要对Stream进行某种操作。这意味着可以在Stream上通过关联多种操作,但最终只需要一次迭代。如果你熟悉Spark RDD,对此应该并不陌生。

  • 相关阅读:
    SecureCRT
    NFS服务器搭建
    卸载oracle步骤
    redhat 5.5 x86_x64搭建samba服务器
    ORA-01940: cannot drop a user that is currently connected
    迁移表空间
    日常SQL使用总结
    DataGuard常规操作命令
    使用PowerDesginer画ER图
    数据库卸载
  • 原文地址:https://www.cnblogs.com/lexiaofei/p/10843124.html
Copyright © 2020-2023  润新知