zoukankan      html  css  js  c++  java
  • Java Lambda表达式

    Lambda


    Lambda表达式:Java8引入的,一种紧凑,传递行为的方式。整个的思想就是函数式编程,什么是函数式编程,即:函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!函数式编程的基础是函数式接口:它指的是有且只有一个未实现的方法的接口,一般通过@FunctionalInterface这个注解来表明某个接口是一个函数式接口。

    语法结构

    比如下面这段例子:

    Runnable multiStatement = () ->{
        System.out.println("Hello");
        System.out.println("lambda");
     };
    

    格式解释:

    • =:=前面是一个函数式接口,=后面可以看出函数的实现
    • ->:->前面即()包住的就是输入即传入参数,当然这个例子里没有参数(如果只有一个参数,可以省略()),->后面即被{}包住的内容就是代码的实现体(如果只有一句代码,可以省略{}).
    • 函数的输出,函数式编程是可以有输出的,可以使用return或者异常退出

    表达式的不同形式

    以下用示例展示:

    • 1.不包含参数,使用()表示没有参数,且返回为void
      Runnable noArguments = () -> System.out.println("Hello,lambda");
    • 2.紧接着1,如果只有一个参数,则可以省略掉()
      ActinListener oenArgument = event -> System.out.println("Hello,lambda");
    • 3.表达式主体不仅仅可以是一个表达式,也可以是一段代码块,代码块使用{}包起来,代码块中语法与普通代码一致没有区别,代码块中也可以使用return或者异常退出
    Runnable multiStatement = () ->{
        System.out.println("Hello");
        System.out.println("lambda");
     };
    
    • 4.带多个参数的方法,这里不是将两个数字相加,而是创建了一个函数来计算两个数字相加的结果,变量 add 类型为 BinaryOperator,他不是两个数字的和,而是指将两个数字相加的那段代码.
    BinaryOperator<Long> add = (x,y) ->x+y;
    //lambda表达式的类型编译器会自动推断得出,所以常常不需要写明,但有时显式地申明出来更好
    BinaryOperator<Long> addExplicit = (Long x,Long y) ->x+y;
    

    函数接口

    函数接口:只有一个抽象方法地接口,可以用作Lambda表达式地类型,这里主要有三个接口Consumer,Function,Predicate
    示例:

    //函数接口
    public interface Predicate<T>{
        Boolean test( T t);
    }
    //lambda表达式,注意这里lambda表达式带了返回值,返回值就是boolean即函数方法的返回值,atLeast5是一个对象就像一个实例,使用的时候如下,然后返回值就是false   
    Predicate<Integer> atLeast5 = x - > x > 5;
    System.out.println(atLeast5.test(4));
    

    Consumer

    Consumer是一个函数式编程接口; 顾名思义,Consumer的意思就是消费,即针对某个东西我们来使用它,表示接受单个输入参数但不返回结果的操作,因此它包含有一个有输入而无输出的accept接口方法;当然除accept方法,它还包含有andThen这个方法
    Oracle API

    public static void consumerTest() {
            Consumer f = System.out::println;
            Consumer f2 = n -> System.out.println(n + "-F2");
    
            //执行完F后再执行F2的Accept方法
            f.andThen(f2).accept("test");
    
            //连续执行F的Accept方法
            f.andThen(f).andThen(f).andThen(f).accept("test1");
        }
    
        public static void main( String[] args ) {
            consumerTest();
        }
    

    Function

    Oracle API

    方法:
    compose是将传入的函数作为参数,将本函数结果作为最终输出
    andThen是将本函数结果传给参数函数,将参数函数的结果作为最终输出

    Predicate

    Oracle API

    本博客为Swagger-Ranger的笔记分享,文中源码地址: https://github.com/Swagger-Ranger
    欢迎交流指正,如有侵权请联系作者确认删除: liufei32@outlook.com

  • 相关阅读:
    VS2005编译mysql5.1.68
    用boost库实现traceroute小工具
    linux内核选项部分翻译
    linux 内核中的锁机制RCU
    先装windows 还是linux ?
    U盘装ubuntu
    编译linux内核3.0
    root密码丢失了怎么办?
    linux配置文件
    新一代linux文件系统btrfs
  • 原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10669971.html
Copyright © 2011-2022 走看看