Java中Lambda表达式和函数式接口的使用和特性
作者:_BugMan 发布时间:2023-06-20 20:05:42
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.函数式接口
内置函数式接口
概述
JDK8内置实现了一些常用的函数式接口:
接口 | 作用 |
Function | 程序中映射逻辑的抽象 |
Predicate | 程序中判断逻辑的抽象 |
Consumer | 程序中的消费型逻辑的抽象 |
Suppiler | 程序中的生产逻辑的抽象 |
Function
Function接口,可以定义入参和出参的类型,可用于类型转换。
代码示例:
Function<String,Integer> function=(String i)-> Integer.parseInt(i);
System.out.println(function.apply("1")==1);
Predicate
Predicate接口,指定返回值为布尔类型,可用于断言。
public static void main(String[] args) {
Predicate<String> predicate = (s) -> s.length() > 0;
// 测试字符串的长度是否>0
System.out.println(predicate.test("hello"));
// 结果取反
System.out.println(predicate.negate().test("hello"));
System.out.println("=====or / and======");
System.out.println(predicate.test(""));
// 增加或判断,二者满足其一则为true
System.out.println(predicate.or(s -> s.equals("")).test(""));
// 增加与判断,二者都满足则为true
System.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<Boolean> nonNull = Objects::nonNull;
Predicate<Boolean> isNull = Objects::isNull;
Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isNotEmpty = isEmpty.negate();
}
Consumer
Consumer接口,又叫消费接口,没有返回值,就像把输入消费掉了一样。
public static void main(String[] args) {
Consumer<Object> consumer1 = new Consumer<Object>() {
@Override
public void accept(Object o) {
System.out.println("这次消费了:" + o.toString());
}
};
consumer1.accept("100w元在双十一!这下穷死了!");
Consumer<String> consumer2 = s -> System.out.println("这次消费了:" + s);
consumer2.accept("120w元在双十二!又穷死了!");
}
Suppiler
Suppiler接口,又叫生产接口,可以自定义返回值,用来生产一些东西。
public static void main(String[] args) {
// 生成一个字符串
Supplier<String> supplier1 = () -> "abcde";
// 生成一个随机数
Supplier<Integer> supplier2 = () -> new Random().nextInt(10);
// 产生一个运行时异常
Supplier<RuntimeException> 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<Integer,Function<Integer,Integer>> functionFunction= x->y->x+y;
System.out.println(functionFunction.apply(2).apply(3));
来源:https://blog.csdn.net/Joker_ZJN/article/details/129535288


猜你喜欢
- java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到
- 1、Java版package com.lyz.utils.common; import java.io.UnsupportedEncodin
- 要求:用DateTimeFormatter实现: 用扫描器获取输入的时间(年月日时分),这个时间的格式是常用的格式,然后格式化这个时间,把格
- 在工作中,我们经常使用线程池,但是你真的了解线程池的原理吗?同时,线程池工作原理和底层实现原理也是面试经常问的考题,所以,今天我们一起聊聊线
- SpringMVC一般使用MultipartFile来做文件的上传,通过MultipartFile的getContentType()方法判定
- 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义。通过
- 本文研究的主要是Java中hashCode的正确求值方法的相关内容,具体如下。散列表有一项优化,可以将对象的散列码(hashCode)缓存起
- 废话不多说,我们先来认识一下这个GDI+,看看它到底长什么样。GDI+:Graphics Device Interface Plus也就是图
- springmvc下载中文文件名称为下划线springboot项目中,在下载文件的时候,通过封装ResponseEntity,将文件流写入b
- 本文实例讲述了C#实现图像锐化的方法。分享给大家供大家参考。具体如下://定义图像锐化函数private static Bitmap Sha
- 对于登录功能本身没有任何特别,使用httpclient向服务器post用户名密码即可。但是为了保持登录的状态(在各个Activity之间切换
- 本篇主要记录AndroidR Settings源码主界面加载流程,方便后续工作调试其流程。Settings代码路径:packages/app
- 1. Spring简介Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。2. Spring的优势 1.方便解耦, 简
- 本文实例为大家分享了Android Studio实现简易进制转换计算器的具体代码,供大家参考,具体内容如下1、问题描述设计并实现一个数制转换
- 1.什么是WebSocketWebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信
- 在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供LockAPI外还在语
- 前言前段时间在写RPC框架的时候用到了Kryo、Hessian、Protostuff三种序列化方式。但是当时因为急于实现功能,就只是简单的的
- 本文实例分析了Android编程之TextView的字符过滤功能。分享给大家供大家参考,具体如下:TextView可以设置接受各式各样的字符
- 由于要在Web项目中采用RFID读取功能,所以有必要开发Activex,一般情况下开发Activex都采用VC,VB等,但对这两块不是很熟悉
- java实现五子棋小游戏package Gomoku;import java.awt.Toolkit;import javax.swing.