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
方法:
compose是将传入的函数作为参数,将本函数结果作为最终输出
andThen是将本函数结果传给参数函数,将参数函数的结果作为最终输出
Predicate
本博客为Swagger-Ranger的笔记分享,文中源码地址: https://github.com/Swagger-Ranger
欢迎交流指正,如有侵权请联系作者确认删除: liufei32@outlook.com
posted on 2019-04-08 13:29 Swagger-Ranger 阅读(198) 评论(0) 编辑 收藏 举报