首页 > 其他分享 >Lambda表达式的使用以及函数式接口

Lambda表达式的使用以及函数式接口

时间:2024-05-25 19:59:37浏览次数:13  
标签:函数 int 接口 Int 参数 表达式 Lambda

目录

Lambda表达式

1.什么是Lambda表达式

2.Lambda表达式的使用

3.Lambda表达式的写法规则(以以上例子来说)

4.要注意的要点

方法引用 

函数式接口

1.什么是函数式接口

2.函数是接口的自定义使用

3.JDK自带的函数式接口

总结 


Lambda表达式

1.什么是Lambda表达式

Lambda表达式(也称为匿名函数或箭头函数)是一种在编程中使用简洁的函数语法来表示一个函数的方法。Lambda表达式允许你在需要一个函数的地方快速定义一个函数,而无需按照传统方式声明一个完整的函数。

从Java 8开始引入Lambda表达式,用于简化代码,特别是在使用集合框架和并行流时

2.Lambda表达式的使用

先来看传统的匿名内部类的写法

// 传统的匿名内部类
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("这是传统的匿名内部类写法");
    }
});

 对比使用Lambda表达式

// 使用Lambda表达式简化
new Thread(() -> System.out.println("这是Lambda表达式写法")).start();

在这个例子中,我们定义了一个线程,它将在启动时打印一段话。使用Lambda表达式,我们可以省略匿名内部类的声明,使代码更加简洁。 

3.Lambda表达式的写法规则(以以上例子来说)

在Lambda表达式中的主要有三部分组成(参数 ,->,执行的逻辑)

参数 -> 要执行对的逻辑

如果没有参数的话就直接用  () ->

在上述的例子中 这个线程中的run()方法就没有参数,所以在Lambda表达式中就是() ->开头

而这个线程中run()方法执行的逻辑是打印一段话,所以箭头后面的执行逻辑就直接写

4.要注意的要点

在有参数的情况下在定义参数的时候要把参数类型明确的指出


(int a, int b)-> a + b


// (在执行的逻辑大于一行的时候不能省略{}以及return)
(int a, int b) -> {int c = a + b; return c}

// 当可以根据上下文推断出参数类型的时候,可以省略参数类型
(a, b) -> a + b

// 这个是函数式接口,里面有且只能有一个方法 --- Lambda表达式就是函数式接口的实现
Interface Lambda1{
	Int op(int a, int b);
}


// 只有一个参数时,()可以省略
a -> a;

// 注意:在定义参数类型的时候 ----- 要么参数类型都加上,要么参数类型都不加,不能一个有参数类型,另外一个没有参数类型

方法引用 

方法引用就是将现有的方法对象调用化为函数对象

// Math::max 是一个方法引用,它引用了 java.lang.Math 类中的 max 静态方法
左侧的方法调用跟右侧的Lambda表达式的作用完全是相似的
Math::max            (int a, int b) -> Math.max(a, b)


// 以下的同理都是方法的引用
非静态方法类型
Student::getName()    (Student stu) -> stu.getName()

构造函数类型
System.out::println    (Object obj) -> System.out.println(obj);

构造函数类型
Student::new            () -> new Student();

函数式接口

1.什么是函数式接口

在Java中,函数式接口(Functional Interface)是指只包含一个抽象方法的接口。这个接口可以有多个默认方法,但抽象方法只能有一个。函数式接口的主要用途是与Lambda表达式一起使用,Lambda表达式提供了这个抽象方法的实现。

2.函数是接口的自定义使用

// 这个是函数式接口,里面有且只能有一个方法 --- Lambda表达式就是函数式接口的实现
// 这种是有参数,有返回值的类型 --- 参数是Int类型的两个参数 返回值是Int类型
对应的Lambda表达式是 (int a, int b) -> 任何返回是Int的逻辑(如 a + b, a * b)
Interface Lambda1{
	Int op(int a, int b);
}


// 这种是有参数,有返回值的类型 --- 参数是Int类型的一个参数 返回值是boolean类型
对应的Lambda表达式 (Integer number) -> (number & 1 == 0)
Interface Lambda2{
	boolean op(int a);
}


// 这种是无参数,有返回值的类型 --- 返回值类型是泛型,返回任何类型
对应的Lambda表达式 Lambda3 lambda =  () -> "这是输出一段话"
() -> Math.random(); ---还可以生成随机数

// 具体实现
Lambda3<String> lambda3 = () -> "hello";
String str = lambda3.op();
System.out.println(str);

Interface Lambda3<T>{
	T op();
}

// 这种是有参数,有返回值的类型 --- 参数是泛型,返回值类型是泛型,返回任何类型
对应的Lambda表达式 (Int a) -> String.valueOf(a) --- 这里参数是Int,返回值是String
Interface Lambda3<T,R>{
	R op(T t);
}

3.JDK自带的函数式接口

以上都是自定的函数式接口,但是在JDK中有自带的函数式接口

 这里的@FunctionalInterface注解的作用就是检查函数式接口是否只有一个方法

这种类型就是返回boolean类型的 一个参数的

@FunctionalInterface
public interface IntPredicate {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param value the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(int value);

 这种类型的是返回Int类型的然后两个参数的

@FunctionalInterface
public interface IntBinaryOperator {

    /**
     * Applies this operator to the given operands.
     *
     * @param left the first operand
     * @param right the second operand
     * @return the operator result
     */
    int applyAsInt(int left, int right);
}

 这种类型是返回一个泛型但是没有参数

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

 这种类型是带两个泛型的(一个参数泛型,一个返回结果泛型)
第一个是方法参数,第二个是返回结果参数

@FunctionalInterface
public interface Function<T, R> {

    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
}

常见的函数式接口

常见的函数接口
1、	Runnable                        () -> void   用在多线程中
2、	Callable                        () -> T		用在多线程中
3、	Comparator                      (T,T) - > int		用来比较的
4、	Consumer,BiConsumer,IntConsumer,LongConsumer,DoubleConsumer
(T) -> void , Bi是两个参数,Int 指参数是int		表示函数对象都没有返回值
5、	Function, BiFunctino,Int Long Double 
(T) -> R, Bi是两参,Int指参数是int		将来的函数对象有参数并且有返回值的 而且参数和返回值的对象不一样
6、	Predicate, BiPredicate, Int Long Double 
(T) -> Boolean, Bi是两参,Int指参数是Int	表示有参数有返回值,返回值类型都是boolean
7、	Supplier, Int Long Double 
() -> T, Int指返回值是int		没有参数,但是有返回值
8、	UnaryOprator, BinaryOperator,Int Long Double  
(T) -> T,Unary 一参, Binary 两参,Int 参数是指int		参数与返回结果要一样

总结 

	名称				    含义
	Consumer			    有参,无返回值
	Function				有参,有返回值
	Predicate				有参,有返回值boolean
	Supplier				无参,有返回值
	Operator				有参,有返回值,并且类型一样

 Lambda表达式和函数式接口的结合使用,使得Java代码能够以一种更加声明式和简洁的方式来表达复杂的逻辑。这种组合特别适用于实现回调机制、事件监听器、线程行为、集合操作等场景

  1. 代码简洁:Lambda表达式和函数式接口使得代码更加简洁,减少了模板代码。

  2. 提高可读性:通过减少冗余代码,提高了代码的可读性。

  3. 易于维护:简洁的代码更易于理解和维护。

  4. 函数式编程:支持函数式编程范式,允许开发者以声明式的方式处理数据集合。

  5. 灵活性:Lambda表达式和函数式接口提供了编写灵活代码的能力,能够更容易地实现高阶函数。

标签:函数,int,接口,Int,参数,表达式,Lambda
From: https://blog.csdn.net/m0_73598900/article/details/139196042

相关文章

  • GeoServer系统wms接口存在远程命令执行漏洞
    漏洞描述该漏洞存在于GeoServer系统的/goserver/wms接口处,攻击者可以利用该漏洞在xml中包含恶意的代码执行任意系统命令,漏洞利用了GeoServer处理WebProcessingService请求时没有正确过滤用户输入,从而导致远程命令执行漏洞。fofaicon_hash="97540678"pocPOST/geoserver/wms......
  • 意外发现openGauss兼容Oracle的几个条件表达式
    意外发现openGauss兼容Oracle的几个条件表达式最近工作中发现openGauss在兼容oracle模式下,可以兼容常用的两个表达式,因此就随手测试了一下。查看数据库版本[omm@openGauss~]$gsql-rgsql((openGauss6.0.0-RC1builded7f8e37)compiledat2024-03-3111:59:31comm......
  • 【算法】栈——逆波兰表达式求值
    题解:逆波兰表达式求值(栈算法)目录1.题目2.题意2.1逆波兰表达式2.2向零截断3.题解4.总结1.题目题目链接:LINK2.题意这个题目种涉及一些概念,应当适当说一下。2.1逆波兰表达式即后缀表达式,是一种数学表达式的表达方式,我们平时数学所用的称为中缀表达式,即:操作数......
  • Go实战全家桶之八:统一ES服务接口之通用查询嵌套查询之封装与增删改API
    开源 goweb:https://gitee.com/ichub/goweb/settings#index需求UML代码位置测试用例:func(this*TestPageEsRequestSuite)Test002_NestBoolQuery(){varreq1=Default()req1.EsShould().EsMatch("dept_name","olivere")req1.EsTerm(&q......
  • 1358:中缀表达式值(expr)
    题目网址:信息学奥赛一本通(C++版)在线评测系统题目介绍:1358:中缀表达式值(expr)时间限制:1000ms      内存限制:65536KB提交数:13372   通过数: 4646【题目描述】输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“......
  • TS泛型:接口、类、约束、类型推导与默认参数、泛型工具
    泛型是用来创建可重用的组件的,是一种传递类型的方式,一个组件可以支持多种类型的数据常用的泛型标识符T(Type):代表Type,在定义泛型时通常用作第一个类型变量名。K(Key):表示对象中的键类型V(Value):表示对象中的值类型E(Element):表示元素类型1.泛型函数2.泛型接口interface......
  • Mybatis-plus的Service接口
    在有了实体类的基础上,创建UserInfoMapper接口,并继承BaseMapper接口publicinterfaceUserInfoMapperextendsBaseMapper<UserInfo>{}继承IService创建Service接口,并创建对应的实现类publicinterfaceUserInfoServiceextendsIService<UserInfo>{}UserInfo......
  • 前端fetch 实现流式接口
    遇到这样一个需求,通过ai动态生成大纲文本,前端在接收到后端的文本内容时,接收的文本是“动态”的,视角表现层面上逐字生成渲染的,效果如下,那么如何实现这种效果?这里就要用到流式接口,也就是流式传输。屏幕录制2024-05-2311.58.55什么是流式传输 先说说传统传输吧,我们......
  • keycloak~登出的回调接口
    对于用户的登出/注销操作,都可以设置一个回调接口,这个接口是作用到client上面的,并且必须是POST接口,相关回调方法的调用,可以参考keycloak14.0.0的这个方法:org.keycloak.services.managers.sendBackChannelLogoutRequestToClientUri核心代码段LogoutTokenlogoutToken=sessio......
  • vite config proxy 代理 外网接口 配置单写法
    viteconfigproxy代理外网接口配置单写法之前一个小坑target:'http://yourdomain/',之前域名后面我写子目录了,导致一直不好使。在这之前,用nginx配置,没配置出来~,所以搞成vite配置走起。。vite.config.jsserver:{proxy:{'/ci':{target:'http:/......