关于函数式接口和编程的解析和案例实战
文章目录
- 匿名内部类
- “匿名”在哪里
- 函数式编程
- lambda表达式的条件
- Supplier
- 使用示例
- Consumer
- accept
- andThen
- 使用场景
- Functional
- BiFunctional
- TriFunctional
匿名内部类
匿名内部类的学习和使用是实现lambda表达式和函数式编程的基础。是想一下,我们在使用接口中的方法的时候,正常流程都是定义这个接口的实现类,然后使用实现类的对象调用接口中的方法。下面展示一个接口的方法使用的常规方法
public interface Test {void forTest();
}
如果想要使用这个接口,我们需要定义Test的实现类
// 定义一个学生类实现 Swim 游泳接口
public class TestImpl implements Test{// 实现方法@Overridepublic void test() {//for testSystem.out.println("测试test方法");}//测试public static void main(String[] args) {// 创建 Student 类的对象 s1TestImpl t = new TestImpl();//打印调用实现的方法t.test();}
}
“匿名”在哪里
1. 匿名了实现的接口所在的父类
java中可以根据传入的对象类型,区分这个对象的类信息,所以匿名的第一层就是省略了这个类,省去了 implements ClassName中的ClassName。之所以被称为 “匿名”,主要是因为它没有显式地定义类名,并且在创建对象的同时就直接实现了某个接口或者继承了某个类,以下是关于它为何可以实现匿名以及具体匿名了哪些信息的详细解释:
2. 匿名了外部独立的类定义结构
匿名内部类将类的定义和使用紧密结合在了一起,它直接嵌套在创建对象的代码语句中,没有像常规类那样在外部单独的代码块里呈现完整的类结构,比如类的修饰符(public、private 等)、类的继承关系(除了在匿名内部类中体现的继承自某个类或者实现某个接口)等这些在普通类定义中可能出现的结构信息都被隐去了,整个类的定义仿佛是 “匿名” 地融入到了使用它的那一处代码当中,使代码结构更加简洁,不过也相对牺牲了一些代码的清晰性和可维护性。换而言之,匿名内部类中我们的TestImpl也不再需要显示给出,这里我们以实现自定义比较器作为示例
List<Integer> nums = Arrays.asList(1,5,3,7,11,6,2);
nums.sort(new Comparator<Integer>(){@Overridepublic int compare(Integer i1, Integer i2){return i2- i1;}
});
3. 其他信息补充说明
对于内部的方法入参和重写的注解,是实现一个接口方法中必须的信息,有无返回值需要根据接口方法定义是void还是其他区分,以上就是匿名内部类的使用。在日常开发中,基于参数是一个接口方法返回值的这种写法较为常见,例如:Runnable或者Comarator等
函数式编程
当前java 8中提供了很多基于函数式的新特性。其中函数式接口有代表性的非 lambda表达式莫属。相较于匿名内部类,lambda表达式更加精简,仅保留传入的实参和返回值以及计算逻辑。上文中的自定义比较器在lambda表达式下可以优化为:“
List<Integer> nums = Arrays.asList(1,5,3,7,11,6,2);
nums.sort((i1, i2) -> i2- i1);
lambda表达式的条件
1. 必须实现的是函数式接口
函数式接口是指只包含一个抽象方法的接口(除了从 Object 类继承的公共方法,如 equals、hashCode 等,这些不算额外的抽象方法)。这是最关键的前提条件,因为 Lambda 表达式本质上就是为了简洁地实现函数式接口而设计的语法糖。
代码示例:“下面的Runnable仅包含一个接口,因此可以改写为lambda表达式
new Runnable() {@Overridepublic void run() {System.out.println("执行任务");}
};
如果是含有多个抽象方法的接口,无法使用lambda表达式改写,因为编译器无法区分你需要覆盖的具体方法,所以下面的接口无法适配lambda表达式的改造
MyTestInterface myObj = new MyTestInterface() {@Overridepublic void method1() {// 具体实现逻辑}@Overridepublic int method2(int num) {return num * 2;}
};
2. 接口抽象方法的参数和返回值类型需明确可推断
虽然 Java 有类型推断机制,但在使用 Lambda 表达式改写匿名内部类时,接口抽象方法的参数类型和返回值类型要能够相对清晰地确定,以便编译器能正确解析 Lambda 表达式所代表的逻辑。例如比较器的重写,编译器可以根据传入的实参判断类型是String
interface StringJoinerFunction {String join(String s1, String s2);
}
public class StringJoinerExampleWithError {public static void main(String[] args) {StringJoinerFunction joiner = (s1, s2) -> {System.out.println(s1 + s2);return s1+s2; // 返回值类型与接口定义的String不符,无法正确改写};System.out.println(joiner.join("Hello", "World"));}
}
3. 实现逻辑相对简单,无复杂的语句块或逻辑分支
这个要求仅仅基于代码本身的可读写,例如一些if else逻辑也可以用于lamvbda表达式,但是却失去了代码简洁原本的意义。不如直接使用匿名内部类或者实现接口的形式完成抽象方法的调用。
Supplier
Supplier(供给者) Supplier是一个不接受任何输入参数但返回一个结果的操作。它主要用于生成数据或对象。Supplier接口定义了一个get方法,该方法不接受任何输入参数并返回一个结果。表示从函数式接口返回的对象中获取Supplier内的数据
Supplier<String> supplier = () -> {return "Hello World";};System.out.println(supplier.get());
Supplier在企业级开发中的应用场景大约有以下几个方面
使用示例
1. 动态加载配置
一些数据库配置信息和连接池的加载如果消耗较大的资源,并且希望使用时候动态加载的情况下,可以使用Supplier预先定义这个连接配置项。避免在应用启动阶段就占用大量内存和初始化时间。
例如,创建一个数据库连接池对象,代码示例如下:
public static Supplier<DataSource> supplier = () -> {HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl("xxxx:3306/pdb_19c");dataSource.setUsername("Hikari");dataSource.setPassword("123456");return dataSource;};public static DataSource getDataSource () {return (DataSource) Optional.ofNullable(supplier).get();}public static Connection getConnectionDyn() throws Exception {return getDataSource().getConnection();}
2. 生成默认数据
继续上面的思路,可以使用static final修饰默认值,使用Supplier处理指向默认值的配置,用作某属性为空的兜底配置
private static final Supplier<Integer> portSupplier = () -> {Optional<Integer> configPort = readPortFromConfig();return configPort.orElse(DEFAULT_PORT);};private static Optional<Integer> readPortFromConfig() {// 模拟从配置文件读取端口号,这里假设返回Optional.empty()表示读取失败Integer i1 = null;return Optional.ofNullable(i1);}public static void main(String[] args) {System.out.println(portSupplier.get());}
3. 实现灵活的策略模式
策略模式在企业级开发中常用于根据不同情况选择不同的业务逻辑执行方式。Supplier 结合 Lambda 表达式可以让策略模式的实现更加简洁和灵活,下面是用Supplier实现的策略模式
public static Supplier<BigDecimal> normalMemberDiscount = () -> {return BigDecimal.valueOf(0.9); // 9折};// 高级会员折扣策略public static Supplier<BigDecimal> premiumMemberDiscount = () -> {return BigDecimal.valueOf(0.8); // 8折};public static BigDecimal calculateDiscount(Order order, Supplier<BigDecimal> discountSupplier) {return order.getAmount().multiply(discountSupplier.get());}
4. 生成运行时的测试数据
Supplier 结合 Lambda 表达式可以方便地实现这一点,让测试数据的生成更加灵活和动态。
例如,在测试一个用户注册模块时,需要生成不同的用户信息作为测试数据
class UserTestDataGenerator {private static Supplier<String> usernameSupplier = () -> {Random random = new Random();return "user_" + random.nextInt(1000);};private static Supplier<String> passwordSupplier = () -> {Random random = new Random();return "pass_" + random.nextInt(1000);};private static Supplier<String> emailSupplier = () -> {Random random = new Random();return "user_" + random.nextInt(1000) + "@example.com";};public static Supplier<User> userSupplier = () -> new User(usernameSupplier.get(), passwordSupplier.get(), emailSupplier.get());
}
Consumer
序言:顾名思义,是消费者的意思。这个函数本身不接收返回值类型,一般实现打印、输出、入参的转换处理等操作
1. 代码示例
下面给出Consumer定义的示例,可以看到这个对象的定义类似于一个Comparator比较器,其作用是接收一个字符串,然后执行accept方法中对于字符串的操作。
Consumer<String> con = new Consumer<String>() {@Overridepublic void accept(String string) {System.out.println("string values :" + string);}};con.accept("Hello World");
如果使用新版idea编译器的亲们,可以发现编译器提示这个方法的优化写法为使用lambda表达式的形式,即下面的格式:
Consumer<String> con = string -> System.out.println("string values :" + string);con.accept("Hello World");
accept
accept在笔者看来可以视作一个开关,当主线程调用这个方法的时候,执行开关内部的逻辑。可以类比线程的submit方法,执行内部的代码块,:
public static void main(String[] args) {// 定义一个Consumer<String>类型的变量,使用Lambda表达式实现其accept方法Consumer<String> stringConsumer = (str) -> System.out.println(str);// 调用accept方法,传入一个字符串参数stringConsumer.accept("Hello, World!");}
}
由上面的代码可以了解到,我们设置Consumer的定义,并且在想要让其执行的地方应用accept()触发Consumer的函数部分,输出了Hello World
andThen
如果一个操作之后还有其他操作,可以将其Consumer对象放到andThen的参数位置上,这个是因为andThen相当于执行accept的accept,从源码分析上可以得到这样的结论
default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
consumer之间可以使用andThen进行串联式的编排,例如对姓名进行输出之后转换字符串为小写,通过consumer的定义和组装可以轻松实现。同时这两consumer对象也可以放在函数方法的形参位置作为回调方法使用
List<String> arr = Arrays.asList("Wang", "Zi", "Meng");Consumer<String> con2 = out -> System.out.print("会员姓名:"+ out +";");Consumer<String> con3 = str2 -> System.out.println("小写版本为: " +str2.toLowerCase());con2.andThen(con3);arr.stream().forEach(con2.andThen(con3)::accept);
输出结果:
使用场景
使用函数式的consumer和普通的for循环有什么区别,将通过下面的示例进行展示
case 1 代码简洁性与可读性
如果在for循环中需要多重处理,并且这段代码整体写在循环体内容易造成多层嵌套或者本身具有一定程度的复用性,应该考虑将其抽象出来作为一个Consumer对象,例如循环处理某一个属性,需要将属性进行字符的转换或者精度的保留
Consumer<String> con = string -> System.out.println(string.toUppercase());con.accept("Hello World");
2. 更好地支持函数式编程范式
Java 8 引入了函数式编程的一些特性,Consumer 作为函数式接口(只包含一个抽象方法 accept 的接口),符合函数式编程中对行为(操作)的抽象概念。它可以方便地与其他函数式接口(如 Predicate、Function 等)以及 Stream API 等配合使用,实现更高级、更灵活的编程模式,比如对集合进行过滤(使用 Predicate)后再对满足条件的元素进行消费(使用 Consumer)等操作,能够在代码中更好地体现数据的转换、处理流程,让代码更具逻辑性和条理性,同时也便于进行代码的单元测试等维护工作。
3. 增强代码的可复用性和灵活性
将操作抽象为 Consumer 接口,可以方便地在不同的地方复用这些操作逻辑。例如,前面提到的将字符串转换为大写的 Consumer 操作,可以在多个需要对字符串进行此处理的地方重复使用,只需要传递这个 Consumer 实例即可。而且通过将 Consumer 作为方法参数,能让方法的功能更加灵活多样,根据传入的不同 Consumer 实现不同的业务逻辑,提高了代码应对不同需求变化的能力,降低了代码的耦合度,使得整个代码库更加易于扩展和维护。虽然在很多情况下使用普通逻辑确实也能实现相同的功能,但 Consumer 函数式接口凭借其在代码简洁性、函数式编程支持以及复用性和灵活性等方面的优势,在 Java 编程中有着广泛且合适的应用场景,能够帮助开发人员更高效、优雅地编写代码,应对各种复杂的业务需求
Functional
通过lambda表达式可以看出匿名内部类的优化写法,func定义如下:
Function<Integer,String> func = new Function<Integer, String>() {@Overridepublic String apply(Integer integer) {return String.valueOf(integer);}};list.stream().forEach(li -> {System.out.println(func.apply(li));});Function<Integer,String> funcLLambda = integer -> String.valueOf(integer);
BiFunctional
这个接口有四个类型参数,T、U、V 分别对应三个输入参数的类型,而 R 对应返回结果的类型,其唯一的抽象方法 apply 接受三个参数(分别为 T、U、V 类型),并返回一个 R 类型的结果,符合接受三个元素作为入参并返回结果的需求,并且由于标注了 @FunctionalInterface,可以很好地使用 Lambda 表达式来实现它。
代码示例
private BiFunction<Double,Double,Double> biFunction = (Double a, Double b) -> Math.sqrt(a*a + b*b);
TriFunctional
这个接口有四个类型参数,T、U、V 分别对应三个输入参数的类型,而 R 对应返回结果的类型,其唯一的抽象方法 apply 接受三个参数(分别为 T、U、V 类型),并返回一个 R 类型的结果,符合接受三个元素作为入参并返回结果的需求,并且由于标注了 @FunctionalInterface,可以很好地使用 Lambda 表达式来实现它
代码示例
public static void main(String[] args) {TriFunction<String, String, String, String> formatFunction = (str1, str2, str3) -> {return String.format("姓名: %s, 年龄: %s, 城市: %s", str1, str2, str3);};String result = formatFunction.apply("张三", "25", "北京");System.out.println(result);}
相关文章:
关于函数式接口和编程的解析和案例实战
文章目录 匿名内部类“匿名”在哪里 函数式编程lambda表达式的条件Supplier使用示例 ConsumeracceptandThen使用场景 FunctionalBiFunctionalTriFunctional 匿名内部类 匿名内部类的学习和使用是实现lambda表达式和函数式编程的基础。是想一下,我们在使用接口中的方…...
基于米尔全志T527开发板的FacenetPytorch人脸识别方案
本篇测评由优秀测评者“小火苗”提供。 本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志 T527开发板)的FacenetPytorch人脸识别方案测试。 一、facenet_pytorch算法实现人脸识别 深度神经网络 1.简介 Facenet-PyTorch 是一个基于 PyTorch 框架实…...
Java基础面试题11:简述System.gc()和Runtime.gc()的作用?
System.gc() 和 Runtime.gc() 是 Java 中用于提示 JVM(Java 虚拟机)进行垃圾回收的两个方法。它们的作用类似,但也有一些细微的区别。下面我们来详细说明。 System.gc() 和 Runtime.gc() 的区别 简单来说,System.gc() 等同于 Run…...
物料理解笔记·蓝白段子线·端子线座子焊接反了怎么处理!!!
目录 蓝白端子排线 端子线座子焊接错了怎么办 端子线如何拆线 编写不易,请勿搬运,仅供学习,感谢理解 蓝白端子排线 蓝白端子排线,这种端子线常用与编码电机的接线,或者在板子上通过提供段子线的接口,通…...
string接口模拟实现2
文章目录 浅拷贝insert插入一个字符insert插入一个字符串删除erasefind(查找一个字符)\\\\\\\find(查找一个字符串:子串substr)查找的练习(网址)赋值operator比较大小 浅拷贝 //浅拷贝string::string(const string& str){//开一样大的空间࿰…...
第 42 章 - Go语言 设计模式
在Go语言中,设计模式是一种被广泛接受的解决常见问题的最佳实践。这些模式可以分为三类:创建型模式、结构型模式和行为型模式。下面我将结合案例以及源代码对这三种类型的设计模式进行详细讲解。 创建型模式 创建型模式主要关注对象的创建过程…...
使用redis-plus-plus库连接redis
使用redis-plus-plus库连接redis 一、安装redis-plus-plus1.1安装hiredis1.2编译安装redis-plus-plus 二、redis的连接使用2.1创建redis对象2.2向redis中添加元素2.3判断元素是否存在2.4获取元素2.5设置获取过期时间2.6获取类型2.7 删除当前数据库 一、安装redis-plus-plus C …...
qt QGraphicsRotation详解
1、概述 QGraphicsRotation 是 Qt 框架中 QGraphicsTransform 的一个子类,它专门用于处理图形项的旋转变换。通过 QGraphicsRotation,你可以对 QGraphicsItem(如形状、图片等)进行旋转操作,从而创建动态和吸引人的视觉…...
嵌入式Qt使用ffmpeg视频开发记录
在此记录一下Qt下视频应用开发的自学历程,可供初学者参考和避雷。 了解常用音频格式yuv420p、h264等了解QML,了解QVideoOutput类的使用,实现播放yuv420p流参考ffmpeg官方例程,调用解码器实现h264解码播放 不需要手动分帧。ffmpeg…...
《String类》
目录 一、定义与概述 二、创建字符串对象 2.1 直接赋值 2.2 使用构造函数 三、字符串的不可变性 四、常用方法 4.1 String对象的比较 4.1.1 比较是否引用同一个对象 4.1.2 boolean equals(Object anObject)方法:按照字典序比较 4.1.3 int compareTo(Strin…...
Java—Properties类
Properties类是Java中用于处理属性文件(.properties文件)的类。属性文件是一种简单的文本文件,用于存储键值对数据,常用于保存配置信息。 Properties类继承自Hashtable类,它的键和值都是字符串类型。它提供了一些方法…...
wireshark抓包TR069协议
Wireshark是一个网络协议分析器,它允许用户捕获和详细查看网络流量。TR069协议是CPE(Customer Premises Equipment,用户驻地设备)和ACS(Auto-Configuration Server,自动配置服务器)之间沟通的通…...
【连接池】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
FileReader和 FileWriter
FileReader和FileWriter是用于操作文件的类,它们分别用于读取和写入数据。下面是它们的一些基本用法: FileReader: 创建一个FileReader对象,指定要读取的文件路径。使用read()方法读取文件的内容,返回一个整数字符表…...
html 中的 <code>标签
定义和用途 <code> 标签是HTML中的一个内联元素,用于定义计算机代码片段。当你需要在网页内容中展示代码,比如编程语言代码(如JavaScript、Python、Java等)、命令行指令、标记语言代码(如HTML、XML等)…...
使用Apache HttpClient发起一个POST HTTP请求
Apache HttpClient 是一个强大的Java库,用于处理HTTP请求。 它支持多种HTTP方法,包括GET、POST、PUT、DELETE等。 本教程将重点介绍如何使用Apache HttpClient发送POST HTTP请求。 POST请求通常用于向服务器发送数据以创建或更新资源。 我们将演示如…...
Android复习代码1-4章
public class RudioButton extends AppCompatActivity {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_rudio_button);// 找到RadioGroup和TextView的实例RadioGroup radioGrou…...
CSS新特性(11)
一.计算盒子宽度calc函数,可以用加减乘除来计算 -*/ 让父盒子永远比子盒子小30像素 二.CSS3过渡transition搭配hover一起使用 该盒子宽度可以从200px到400px,谁做变化给谁加 不仅要写宽还要写高利用逗号,多个属性一起写都用逗号 既想要宽度变又想要高度…...
架构-微服务-服务网关
文章目录 前言一、网关介绍1. 什么是API网关2. 核心功能特性3. 解决方案 二、Gateway简介三、Gateway快速入门1. 基础版2. 增强版3. 简写版 四、Gateway核心架构1. 基本概念2. 执行流程 五、Gateway断言1. 内置路由断言工厂2. 自定义路由断言工厂 六、过滤器1. 基本概念2. 局部…...
Leetcode(区间合并习题思路总结,持续更新。。。)
讲解题目:合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间, 并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入&a…...
11.21c++中的函数
练习: 编写mystring类:拥有以下功能: 1.带参、无参构造函数,拷贝构造函数,析构函数 2.编写 append(const mystring r) 为当前字符串尾部,拼接新的字符串r 3.编写 isEqual(const mystring r) 判断当前字符串…...
Rook入门:打造云原生Ceph存储的全面学习路径(下)
文章目录 六.Rook部署云原生CephFS文件系统6.1 部署cephfs storageclass6.2 创建容器所需cephfs文件系统6.3创建容器pod使用rook-cephfs提供pvc6.4 查看pod是否使用rook-cephfs 七.Ceph Dashboard界面7.1 启用dashboard开关7.2 ceph-dashboard配置外部访问7.3 Dashboard web ad…...
UI控件使用说明
文章目录 一、控件的公共属性二、常用控件的私有属性三、控件的显示与隐藏 一、控件的公共属性 struct element {u32 highlight: 1; //高亮标志u32 state: 3; //内核记录控件的状态u32 ref: 5; //内核计数值u32 prj: 3; //工程序号u32 hide_action: 1; //HIDE_WI…...
Java面向对象.抽象
目录 1.object类 一、Object类的地位 所有类的父类 2.抽象类 一、定义与声明 抽象类的概念 二、抽象方法 抽象方法的特点 三、继承抽象类 子类的责任 3.抽象方法基础理念 1.抽象方法的特征 2.将abstaract加在方法的前面,该类无法被继承 1.首先࿰…...
uniapp在小程序连接webScoket实现余额支付
webScoket文档:uni.connectSocket(OBJECT) | uni-app官网 /plugins/event.js const Dep function() {this.Evens Object.create(null); } class Event {constructor({dep new Dep()} {}) {if (dep.constructor Object && Object.keys(dep).length 0…...
【C语言】连接陷阱探秘(4):检查外部类型
目录 一、外部类型概述 1.1. 外部类型的重要性 1.2. 外部类型在C语言中的使用 1.3. 注意事项 二、常见的外部类型陷阱 2.1. 结构体和联合体的大小不匹配 2.1.1. 示例代码 2.1.2. 正确的做法 2.2. 枚举类型的值不匹配 2.3. 函数签名不一致 2.3.1. 函数签名不一致的问…...
Hexo博客在多个设备同步
title: ‘Hexo博客在多个设备同步’ date: 2024-11-28 19:08:08 categories: Hexo教程 cover: /img/cover4.jpg description: ‘实现Hexo博客在不同的设备上都可以使用和上传’ 博客链接1 :Hexo搭建博客的多终端同步问题 博客链接2:Hexo博客多台电脑设备同步管理 …...
Pytorch使用手册-使用 TensorBoard 可视化模型、数据和训练过程(专题十)
在 60 分钟速成课程中,我们展示了如何加载数据,将其传递通过我们定义的作为 nn.Module 子类的模型,训练该模型并在测试数据上进行测试。为了查看发生了什么,我们在模型训练过程中打印一些统计信息,以便了解训练是否进展顺利。然而,我们可以做得更好:PyTorch 与 TensorBo…...
Linux网络——NAT/代理服务器
一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题,NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…...
使用ffmpeg命令实现视频文件间隔提取帧图片
将视频按每隔五秒从视频中提取一张图片 使用 ffmpeg 工具,通过设置 -vf(视频过滤器)和 -vsync 选项 命令格式 ffmpeg -i input_video.mp4 -vf "fps1/5" output_%03d.png 解释: -i input_video.mp4:指定输…...
Elasticsearch实战:从搜索到数据分析的全面应用指南
Elasticsearch(简称 ES)是一个强大的分布式搜索引擎和分析工具,它能够快速处理海量数据,并提供全文检索、结构化搜索、数据分析等功能。在现代系统中,它不仅是搜索的核心组件,也是数据分析的有力工具。 本文…...
【CSS in Depth 2 精译_064】10.3 CSS 中的容器查询相对单位 + 10.4 CSS 容器样式查询 + 10.5 本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 10.2.1 容器的类型10.2.2 容器的名称10.2.3 容器与模块化 CSS 10.3 与容器相关的单位 ✔…...
滑动窗口讲解(c基础)
滑动窗口的基本概念 滑动窗口是一种高效处理线性数据结构(如数组、字符串)的算法技巧。它就像是一个可移动的 “框”,框住数据结构中的一部分元素,通过不断地移动这个 “框”(即滑动窗口),对框内…...
Flink的双流join理解
如何保证Flink双流Join准确性和及时性、除了窗口join还存在哪些实现方式、究竟如何回答才能完全打动面试官呢。。你将在文中找到答案。 1 引子 1.1 数据库SQL中的JOIN 我们先来看看数据库SQL中的JOIN操作。如下所示的订单查询SQL,通过将订单表的id和订单详情表ord…...
springboot341+vue校园求职招聘系统设计和实现pf(论文+源码)_kaic
毕 业 设 计(论 文) 校园求职招聘系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,…...
dmdba用户资源限制ulimit -a 部分配置未生效
dmdba用户资源限制ulimit -a 部分配置未生效 1 环境介绍2 数据库实例日志报错2.1 mpp01 实例日志报错2.2 mpp02 实例日志报错 3 mpp02 服务器资源限制情况4 关闭SELinux 问题解决4.1 临时关闭 SELinux4.2 永久关闭 SELinux 5 达梦数据库学习使用列表 1 环境介绍 Cpu x86 Os Ce…...
kafka-clients之CommonClientConfigs
CommonClientConfigs是kafka-clients库中一个包含Kafka通用配置项的类,它定义了Kafka Producer、Consumer、Admin等客户端共享的配置。以下是其中的主要配置项及其含义: 1. bootstrap.servers 类型:List<String>说明:Kafk…...
支持多种快充协议的取电芯片,支持最大功率140W
前言 在快节奏的现代生活中,人们对于小家电的依赖日益加深,而随之而来的充电问题也日益凸显。传统的充电方式往往受限于电压、电流的限制,难以满足不同设备对电力的多样化需求。而PD快充协议的诞生,则为这一难题提供了全新的解决…...
《Vue零基础入门教程》第十四课:列表渲染
往期内容 《Vue零基础入门教程》第六课:基本选项 《Vue零基础入门教程》第八课:模板语法 《Vue零基础入门教程》第九课:插值语法细节 《Vue零基础入门教程》第十课:属性绑定指令 《Vue零基础入门教程》第十一课:事…...
Linux系统 进程
Linux系统 进程 进程私有地址空间用户模式和内核模式上下文切换 进程控制进程控制函数获取进程 ID创建和终止进程回收子进程让进程休眠加载并运行程序 系统调用错误处理利用fork和execve运行程序 进程 异常是允许操作系统内核提供进程(process)概念的基…...
文件具有selinux标签如下 system_u:object_r:httpd_sys_content:s0:c3 解释一下每段的含义?
文件具有selinux标签如下 system_u:object_r:httpd_sys_content:s0:c3 解释一下每段的含义? SELinux标签通常由四个部分组成,分别用于定义文件的上下文、访问控制策略以及系统安全性。针对你提供的标签:system_u:object_r:httpd_sys_content:s0:c3&…...
对偶分解算法详解及其Python实现
目录 对偶分解算法详解及其实现第一部分:对偶分解算法概述1.1 什么是对偶分解算法1.2 应用场景1.3 算法优点第二部分:对偶分解算法的数学推导2.1 问题形式2.2 对偶问题2.3 算法框架第三部分:对偶分解算法的Python实现第四部分:案例1——支持向量机中的对偶分解(策略模式)…...
Linux之web服务器
一、web 服务器简介 1.www 简介 www 是全球信息广播的意思,上网即使用 www 来查询信息,它结合多种多媒体,通过超链接以 Internet 传递信息。上网时,网站提供数据,客户端用浏览器解析数据。 www 所用协议为 HTTP&…...
十二、Pod的扩缩容-手动/自动-HPA
在实际生产系统中,经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。此时可以利用Deployment/RC的Scale机制来完成这些工作。 Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过运行kubectl sca…...
RabbitMQ高级特性:TTL、死信队列与延迟队列
RabbitMQ高级特性:TTL、死信队列与延迟队列 RabbitMQ作为一款开源的消息代理软件,广泛应用于分布式系统中,用于实现消息的异步传递和系统的解耦。其强大的高级特性,包括TTL(Time-To-Live)、死信队列&#…...
UPLOAD LABS | UPLOAD LABS 靶场初识
关注这个靶场的其它相关笔记:UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01:UPLOAD LABS 靶场简介 UPLOAD LABS 靶场是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列文件上传漏洞的实验环境,用于帮助用户了解文件上传漏洞的…...
杰发科技AC7803——不同晶振频率时钟的配置
计算公式 PLL_POSDIV [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62] PLL_PREDIV_1 1 2 4 USE_XTAL 24M SYSCLK_FREQ 64M SYSCLK_DIVIDER 1 VCO USE_XTAL*…...
cocos creator 触摸事件官方案例
cocos creator 触摸事件官方案例 1、官方示例; 2、对官方示例的总结: (1)介绍了鼠标事件和触摸事件的类型,这里主要关注的是在移动端和PC端都可以触发的触摸事件。 (2)节点事件的派发&#…...
浅谈人工智能之基于容器云进行图生视频大模型搭建
浅谈人工智能之基于容器云进行图生视频大模型搭建 根据之前我们所讲过的内容: 文生图 文生视频 我们继续讲解图生视频大模型搭建。 引言 随着深度学习技术的不断发展,图生视频(image-to-video)大模型成为了计算机视觉和自然语言…...
【爬虫框架:feapder,管理系统 feaplat】
github:https://github.com/Boris-code/feapder 爬虫管理系统 feaplat:http://feapder.com/#/feapder_platform/feaplat 爬虫在线工具库 :http://www.spidertools.cn :https://www.kgtools.cn/1、feapder 简介 对于学习 Python…...