一、Lamdba 表达式与函数式接口(最终版)

2024-01-26 06:04

本文主要是介绍一、Lamdba 表达式与函数式接口(最终版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Lamdba 表达式与函数式接口

1.1 Lamdba 表达式与函数式接口

1.1.1 Lambda 表达式概述

  • Lambda 表达式是 Java 8 引入的一个新特性
  • Lambda 表达式可以被视为匿名函数
  • 允许在需要函数的地方以更简洁的方法定义功能
  • Lambda 表达式可以完成简洁的函数定义
  • Stream API 中大量使用了 Lambda 表达式,可以使用 Lambda 表达式对集合进行操作
  • Lambda 表达式允许你将函数作为参数传递传递给其它函数,或将函数组合在一起形成新的函数

1.1.2 使用 Lambda 表达式实现接口

  • 首先定义一个接口
interface MyInterface {int sum(int x,int y);
}
public class Main {public static void main(String[] args) {}
}
  • 使用 Lambda 表达式实现接口
interface MyInterface {int sum(int x,int y);
}
public class Main {public static void main(String[] args) {MyInterface myInterface = (int x,int y) ->{return x+y;};System.out.println(myInterface.sum(1, 2));}
}

1.1.3 函数式接口概述

  • 接口中只有一个未实现的方法,被称为函数式接口
  • 只要是函数式接口,就可以使用 Lambda 表达式
  • 在 Java 中可以使用 @FunctionalInterface 来表示函数式接口

1.1.4 Lambda 表达式简写形式

1、参数类型可以不写,只写参数名

 MyInterface myInterface = (x,y) ->{return x+y;};

2、参数变量名也可以随意定义,但是参数数量一定要一致

 MyInterface myInterface = (i,j) ->{return x+y;};

3、如果只有一个参数,可以不写小括号,但没有参数一定要写小括号

 MyInterface myInterface1 = i ->{return i;
};MyInterface myInterface2 = () ->{return 1;
};

4、方法体如果只有一句话,可以省略 {}

 MyInterface myInterface = i -> return i;

1.2 Function PAI 函数式接口

1.2.1 Function 函数式接口概述

  • Function API 是 Java 函数式接口的底层定义
  • Function API 包括了许多不同种类类型的函数式接口
  • 以支持各种函数式编程风格和操作

1.2.2 Function API 不同类型的函数式接口

以下是 Function API 内置的函数式接口

image-20240123200328203

  • 其中标红的四个接口 Consumer、Function、Perdicate、Supplier 是四个常见的函数式接口
  • 它们四个代表了函数式编程中的不同类型
    • Consumer 接口 表示接受一个参数并无返回值操作,被称为消费者
    • Function 接口 表示接受一个参数并返回一个结果的函数,通常被视为常用的函数接口
    • Perdicate 接口表示接受一个参数并返回一个布尔值,被称为断言
    • Supplier 接口表示无参数并返回一个结果,并成为提供者

1.2.3 使用 Function 不同类型的接口完成小案例

小案例

1.使用 Supplier 生成一个字符串数据

2.使用 Predicate 验证输入字符串是否为数字

3.使用 Function 转换数据,将字符串转为数字

4.使用 Consumer 判断数字是奇数还是偶数

5.将上面一系列操作串联起来

每个函数式接口当中都有一个方法,需要调用,如果不清楚方法名,可找到这个接口自行查看

1、使用 Supplier 生成一个字符串数据

package org.example;import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//生成一个字符串数据Supplier<String> supplier=() -> "42";System.out.println(supplier.get());}
}

2、使用 Predicate 验证输入字符串是否为数字

package org.example;import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//验证输入字符串是否为数字Predicate<String> predicate=str -> str.matches("-?\\d+(\\.\\d+)?");System.out.println(predicate.test("435"));System.out.println(predicate.test("435a"));}
}

3、转换数据,将字符串转为数字

package org.example;import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//转换数据,将字符串转为数字Function<String,Integer> function= Integer::parseInt;Integer num = function.apply("435");System.out.println(num);}
}

4、判断数字是奇数还是偶数

package org.example;import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//判断数字是奇数还是偶数Consumer<Integer> consumer=integer -> {if (integer %2 == 0){System.out.println("偶数"+integer);}else {System.out.println("奇数"+integer);}};consumer.accept(44);}
}

5、将这些操作串联起来,实现判断 Supplier 生成的字符串是奇数还是偶数

package org.example;import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//生成一个字符串数据Supplier<String> supplier=() -> "42";//验证输入字符串是否为数字Predicate<String> predicate=str -> str.matches("-?\\d+(\\.\\d+)?");//转换数据,将字符串转为数字Function<String,Integer> function= Integer::parseInt;//判断数字是奇数还是偶数Consumer<Integer> consumer=integer -> {if (integer %2 == 0){System.out.println("偶数"+integer);}else {System.out.println("奇数"+integer);}};//将这些操作串联起来,实现判断 Supplier  生成的字符串是奇数还是偶数if(predicate.test(supplier.get())){consumer.accept(function.apply(supplier.get()));}else {System.out.println("非法数字");}}
}

6、也可以将他们全部组合成一个方法

package org.example;import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionMethod {public static void main(String[] args) {myMethod(() -> "4aaa",str -> str.matches("-?\\d+(\\.\\d+)?"),Integer::parseInt,integer -> {if (integer %2 == 0){System.out.println("偶数"+integer);}else {System.out.println("奇数"+integer);}});}private static void myMethod(Supplier<String> supplier,Predicate<String> predicate,Function<String,Integer> function,Consumer<Integer> consumer){if(predicate.test(supplier.get())){consumer.accept(function.apply(supplier.get()));}else {System.out.println("非法数字");}}
}

1.3 Stream API

1.3.1 Stream API 概述

  • Stream API 主要用于处理集合数据的流式操作
  • Stream API 提供了一些列的操作方法,如过滤、排序、映射、聚合等
  • Stream API 可以从各种数据源创建流,如集合、数组、文件等
  • 它的内部采用了并行处理机制,在处理大数据集时具有较高的性能优势

1.3.2 Stream 流的简介

  • Stream被翻译为流,它的工作过程像将一瓶水导入有很多过滤阀的管道一样,水每经过一个过滤阀,便被操作一次,比如过滤,转换等,最后管道的另外一头有一个容器负责接收剩下的水。

  • 就类似于将数据导入一个管道,一遍遍的过滤,最后形成一个最终需要的数据,然后接收结果

  • 将数据导入一个过滤的导管中被称为创建流

  • 将数据一遍遍的过滤,被称为中间操作,我们可以定义很多种中间操作

  • 数据过滤成想要的结果时,需要进行 终止操作

  • 然后最后再接收结果

  • 这些操作就称之为流式操作

  • 而流的三大部分主要分为

    • 创建数据流
    • N 个中间操作
    • 1 个终止操作
  • 因为流式操作是可以并发的,所以所有并发流的操作都是无状态数据

    • 数据状态只在函数内有效
    • 不溢出至函数外

1.3.3 Stream API 的基本使用

以下是一个 Stream API 的小案例,用于筛选出集合中的偶数

然后将偶数转为字符串,遍历出来进行输出

package org.example;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamAPI {public static void main(String[] args) {// 创建一个整数列表List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 Stream API 进行操作numbers.stream()// 筛选偶数.filter(number -> number % 2 == 0)// 排序.sorted()// 映射为字符串.map(String::valueOf)// 收集结果.collect(Collectors.toList()).forEach(System.out::println);}
}
  • **通过 numbers.stream() 方法将列表转换为 Stream,这个步骤为创建数据流 **

  • 使用 filter() 方法筛选出偶数,为中间操作

  • 使用 sorted() 方法对筛选后的结果进行排序,为中间操作

  • 使用 mapToObj() 方法将流中的整数映射为字符串,为中间操作

  • 使用 collect(Collectors.toList()) 方法将映射后的结果收集到一个新的列表中,为中间操作

  • 最后,使用 forEach() 方法遍历并打印收集后的结果,为终止操作

  • 判断是否是中间操作,还是终止操作

    • 可以直接点开类查看注释
    • 中间操作一般都有返回值
    • 终止操作一般是没有返回值的,也可以快速判断
  • **通过 numbers.stream() 方法将列表转换为 Stream,这个步骤为创建数据流 **

  • 使用 filter() 方法筛选出偶数,为中间操作

  • 使用 sorted() 方法对筛选后的结果进行排序,为中间操作

  • 使用 mapToObj() 方法将流中的整数映射为字符串,为中间操作

  • 使用 collect(Collectors.toList()) 方法将映射后的结果收集到一个新的列表中,为中间操作

  • 最后,使用 forEach() 方法遍历并打印收集后的结果,为终止操作

  • 判断是否是中间操作,还是终止操作

    • 可以直接点开类查看注释
    • 中间操作一般都有返回值
    • 终止操作一般是没有返回值的,也可以快速判断

这篇关于一、Lamdba 表达式与函数式接口(最终版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/645847

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to