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

原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10669971.html