详解JAVA lambda表达式、函数式接口
创始人
2025-05-28 18:46:24

目录

1.概述

2.lambda表达式的基础

3.JAVA中的lambda表达式

4.函数式接口

4.1.内置函数式接口

4.1.1.概述

4.1.2.Function

4.1.3.Predicate

4.1.4.Consumer

4.1.5.Suppiler

5.级联、柯里化


1.概述

当Java 8发布时,其中最令人兴奋的特性之一就是 Lambda 表达式。Lambda 表达式是一种轻量级、简洁和高效的函数式编程方法。它可以用来代替 Java 旧有的匿名内部类,提高代码的可读性和可维护性。

2.lambda表达式的基础

Lambda 表达式是一个匿名函数,由输入参数和处理逻辑两部分组成:

(parameter1, parameter2, ...) -> { code block }

输入或者输出可以为空:

() -> System.out.println("Hello, world!")
(a) -> {}
() -> {}

多参数用括号,单参数可以不用括号:

(a,b) -> a+b
a -> System.out.print(a)

多条处理逻辑用花括号,单条处理逻辑可以不用花括号:

(a,b) -> a+b;
(a,b) -> {a+b;a-b;}

3.JAVA中的lambda表达式

要在 Java 中使用 Lambda 表达式,需要将它们赋值给一个函数式接口变量。函数式接口是只包含一个抽象方法的接口,它们提供了一种定义 Lambda 表达式类型的方式。例如,下面的函数式接口 MyInterface 包含了一个抽象方法 doSomething

interface MyInterface {void doSomething();
}

要使用 Lambda 表达式实现这个接口,只需要提供一个与 doSomething 方法签名匹配的 Lambda 表达式即可。例如,下面的代码使用 Lambda 表达式创建了一个 MyInterface 对象,并调用了它的 doSomething 方法:

MyInterface myLambda = () -> System.out.println("Hello, world!");
myLambda.doSomething();

在这个例子中,我们使用 Lambda 表达式创建了一个 MyInterface 对象,并将它赋值给了 myLambda 变量。然后,我们调用了 myLambda.doSomething() 方法,输出了 Hello, world!

4.函数式接口

4.1.内置函数式接口

4.1.1.概述

JDK8内置实现了一些常用的函数式接口:

接口作用
Function程序中映射逻辑的抽象
Predicate程序中判断逻辑的抽象
Consumer程序中的消费型逻辑的抽象
Suppiler程序中的生产逻辑的抽象

4.1.2.Function

Function接口,可以定义入参和出参的类型,可用于类型转换。

代码示例:

Function function=(String i)-> Integer.parseInt(i);
System.out.println(function.apply("1")==1);

4.1.3.Predicate

Predicate接口,指定返回值为布尔类型,可用于断言。

public static void main(String[] args) {Predicate predicate = (s) -> s.length() > 0;// 测试字符串的长度是否>0System.out.println(predicate.test("hello"));// 结果取反System.out.println(predicate.negate().test("hello"));System.out.println("=====or / and======");System.out.println(predicate.test(""));// 增加或判断,二者满足其一则为trueSystem.out.println(predicate.or(s -> s.equals("")).test(""));// 增加与判断,二者都满足则为trueSystem.out.println(predicate.and(s -> s.equals("hello")).test(""));System.out.println(predicate.and(s -> s.equals("hello")).test("hello"));System.out.println("=====isEqual======");// 判断是否相等System.out.println(Predicate.isEqual("hello").test(""));System.out.println(Predicate.isEqual("hello").test("hello"));Predicate nonNull = Objects::nonNull;Predicate isNull = Objects::isNull;Predicate isEmpty = String::isEmpty;Predicate isNotEmpty = isEmpty.negate();}

4.1.4.Consumer

Consumer接口,又叫消费接口,没有返回值,就像把输入消费掉了一样。

public static void main(String[] args) {Consumer consumer1 = new Consumer() {@Overridepublic void accept(Object o) {System.out.println("这次消费了:" + o.toString());}};consumer1.accept("100w元在双十一!这下穷死了!");Consumer consumer2 = s -> System.out.println("这次消费了:" + s);consumer2.accept("120w元在双十二!又穷死了!");
} 

4.1.5.Suppiler

Suppiler接口,又叫生产接口,可以自定义返回值,用来生产一些东西。

public static void main(String[] args) {// 生成一个字符串Supplier supplier1 = () -> "abcde";// 生成一个随机数Supplier supplier2 = () -> new Random().nextInt(10);// 产生一个运行时异常Supplier supplier3 = () -> new RuntimeException();System.out.println(supplier1.get());System.out.println(supplier2.get().intValue());System.out.println(supplier3.get());
}

5.级联、柯里化

级联表达式,含有多个箭头的lambda表达式,即“套娃”lambda表达式。

以下列lambda表达式为例:

x->y->x+y

假设输入的为Integer类型,

用Function接口来表达即为:

输入一个Integer x,返回一个Integer y,

        Integer y又可以用Function接口来表示为:

                输入一个Integer,返回一个Integer

Function> functionFunction= x->y->x+y;
System.out.println(functionFunction.apply(2).apply(3));

相关内容

热门资讯

18 万人次 5 天狂欢!哈尔... 零下 20℃的哈尔滨,寒气逼人却挡不住八方来客的热情。12 月 17 日开园的第二十七届哈尔滨冰雪大...
原创 是... 标题:是回锅肉不是肥锅肉,让你直流口水还想再吃一碗米饭 在这个快节奏的时代,美食不仅仅是味蕾的享受...
原创 晚... 标题:晚上来一碗,大补气血,冬天吃它好处多多,但早上可千万别吃! 在这个寒冷的冬季,人们往往容易感...
原创 冬... 导读:每年冬至后,正是阳气初升的时候,此时身体所需要的营养也是最多的。而要想身体好,就需要吃好喝好睡...
冬天其实也很好瘦 5件易坚持小... 天气一冷,很多人自动放弃减肥计划:不想动,只想躺,火锅、奶茶、甜点轮番上。但一年中最好瘦的季节,就是...