当前位置: 首页 > news >正文

Scala语言基础:开启你的 Flink 之旅

引言:为什么选择Scala?

大家好,我是心海!

Scala(Scalable Language)是一门融合面向对象与函数式编程的现代语言。它像瑞士军刀一样灵活——既能编写简洁的脚本,又能构建复杂的分布式系统。想象你正在组装乐高积木:Scala提供标准积木块(面向对象),同时允许你自定义连接器(函数式特性),让创作随心所欲。

当然,如果你已经有了 python 或者 Java 的编程语言基础,那学起来会更加轻松!

目录

 一、变量:数据的容器

二、函数:执行特定任务的代码块

 三、集合操作:数据处理利器

3.1 三大集合类型

 3.2 实战示例

 四、匿名函数:没有名字的函数

五、高阶函数:操作其他函数的函数

 六、 类和对象:构建程序的蓝图和实例

七、样例类(Case Class):简洁的数据载体

八、隐式转换(Implicit Conversions):让代码更灵活

九、类别系统

结语:开启Flink之旅

 


 一、变量:数据的容器

变量就像一个个贴着标签的盒子,我们可以把数据放进这些盒子里,并通过标签找到它们。在 Scala 中,我们有两种主要的变量类型:val 和 var

  • val:声明后不可变,推荐默认使用,如宇宙中的物理常数

  • var:可变,谨慎使用,如同随时可能修改的日程表

val name = "Alice"  // 不可变,像刻在石碑上的名字
var age = 25        // 可变,像白板上的数字
// name = "Bob"     // 编译错误!
age = 26            // 允许修改

 类型推断 Scala 拥有强大的类型推断能力,很多时候你可以省略变量的类型声明,让编译器自动帮你推断。

val name = "Alice" // 编译器会自动推断 name 是 String 类型
var age = 30 // 编译器会自动推断 age 是 Int 类型

二、函数:执行特定任务的代码块

函数是组织代码的基本单元。它可以接收输入(参数),执行一系列操作,并返回输出(返回值)。

定义函数:

def add(a: Int, b: Int): Int = {a + b
}
  • 参数类型必须声明

  • 返回值类型可省略(但推荐显式声明)

在 Scala 中,我们使用 def 关键字来定义函数。

def greet(name: String): String = {
s"Hello, $name!"
}val greeting = greet("Bob")
println(greeting) // 输出 Hello, Bob!

代码解析:

  • def greet: 声明一个名为 greet 的函数。

  • (name: String): 定义一个名为 name 的参数,类型为 String。

  • : String: 指定函数的返回值类型为 String。

  • = { ... }: 函数体,包含要执行的代码。

  • s"Hello, $name!": 使用字符串插值(string interpolation)构建返回的字符串。s 前缀允许我们在字符串中使用 $变量名 的方式嵌入变量的值。

省略返回值类型: 如果函数体比较简单,Scala 也可以进行返回值类型推断,你可以省略 : String。
 

def add(a: Int, b: Int) = a + b
val sum = add(5, 3)
println(sum) // 输出 8


 

 三、集合操作:数据处理利器

3.1 三大集合类型

Scala 提供了强大且易用的集合库,可以帮助我们高效地处理列表(List)、映射(Map)、集合(Set)等数据结构。

集合类型特点示例
List有序可重复List(1,2,3,3)→ 1,2,3,3
Set无序唯一Set(1,2,2,3) → 1,2,3
Map键值对Map("a"->1,"b"->2)

 

  • List(列表):有序的元素集合,允许重复。

    val numbers: List<Int> = List(1, 2, 2, 3, 4)
    println(numbers.head) // 输出第一个元素:1
    println(numbers.tail) // 输出除第一个元素外的列表:List(2, 2, 3, 4)
    println(numbers.length) // 输出列表的长度:5
    

  • Map(映射):存储键值对的集合,键是唯一的。

    val ages: Map<String, Int> = Map("Alice" -> 30, "Bob" -> 25, "Charlie" -> 35)
    println(ages("Alice")) // 输出 Alice 的年龄:30
    println(ages.get("David")) // 输出 Option(None),因为 "David" 不存在
    println(ages.keys) // 输出所有键:Set(Alice, Bob, Charlie)
    println(ages.values) // 输出所有值:Iterable(30, 25, 35)

  • Set(集合):不包含重复元素的集合,元素的顺序不保证。

    val uniqueNumbers: Set<Int> = Set(1, 2, 2, 3, 4)
    println(uniqueNumbers) // 输出 Set(1, 2, 3, 4),重复的 2 被去掉了
    println(uniqueNumbers.contains(3)) // 输出 true

 3.2 实战示例

case class User(name: String, age: Int, active: Boolean)val users = List(User("Alice", 25, true),User("Bob", 30, false),User("Charlie", 28, true)
)// 统计活跃用户的平均年龄
val avgAge = users.filter(_.active)      // 筛选活跃用户.map(_.age)            // 提取年龄.sum.toDouble /        // 计算总和users.count(_.active)  // 统计数量println(f"平均年龄:$avgAge%.1f") // 输出:平均年龄:26.5

 四、匿名函数:没有名字的函数

有时候,我们需要一个函数,但又不想给它起个名字。这时,匿名函数就派上用场了。在 Scala 中,匿名函数也称为函数字面量(function literal)。

语法: (参数列表) => 函数体 

val addOne: Int => Int = (x: Int) => x + 1
println(addOne(5)) // 输出 6val multiply = (a: Int, b: Int) => a * b
println(multiply(3, 4)) // 输出 12

类型推断简化: 在很多情况下,Scala 可以推断匿名函数的参数类型,你可以进一步简化语法。

val addOneSimplified: Int => Int = x => x + 1
val multiplySimplified = (a, b) => a * b

 


五、高阶函数:操作其他函数的函数

高阶函数是指那些接受一个或多个函数作为参数,或者返回一个函数的函数。它们是函数式编程的核心概念,让我们可以编写更灵活、更简洁的代码。

map:对集合中的每个元素应用一个函数,并返回一个新的集合。

val numbersList = List(1, 2, 3)
val doubledNumbers = numbersList.map(x => x * 2) // 对每个元素乘以 2
println(doubledNumbers) // 输出 List(2, 4, 6)// 更简洁的写法:使用占位符 _ 代表每个元素
val tripledNumbers = numbersList.map(_ * 3)
println(tripledNumbers) // 输出 List(3, 6, 9)

filter:根据指定的条件过滤集合中的元素,返回满足条件的新集合.

val numbersToFilter = List(1, 2, 3, 4, 5, 6)
val evenNumbers = numbersToFilter.filter(x => x % 2 == 0) // 过滤出偶数
println(evenNumbers) // 输出 List(2, 4, 6)val oddNumbers = numbersToFilter.filter(_ % 2 != 0)
println(oddNumbers) // 输出 List(1, 3, 5)

reduce:将集合中的元素通过一个二元操作符组合起来,最终得到一个单一的值。

val numbersToReduce = List(1, 2, 3, 4)
val sumOfNumbers = numbersToReduce.reduce((a, b) => a + b) // 将所有元素相加
println(sumOfNumbers) // 输出 10// 更简洁的写法
val productOfNumbers = numbersToReduce.reduce(_ * _) // 将所有元素相乘
println(productOfNumbers) // 输出 24

 综合案例:

val numbers = List(1, 2, 3, 4)// 流水线处理
numbers.map(_ * 2)      // 放大:变成List(2,4,6,8).filter(_ > 3)   // 筛选:List(4,6,8).reduce(_ + _)   // 聚合:4+6+8=18

 六、 类和对象:构建程序的蓝图和实例

在面向对象编程中,类是创建对象的蓝图,而对象是类的具体实例。

  • 定义类:

    class Person(val name: String, var age: Int) {
    def greet(): Unit = {
    println(s"Hi, my name is $name and I am $age years old.")
    }
    }// 创建对象
    val person1 = new Person("Alice", 30)
    val person2 = new Person("Bob", 25)person1.greet() // 输出 Hi, my name is Alice and I am 30 years old.
    person2.age = 26 // 修改 Bob 的年龄
    person2.greet() // 输出 Hi, my name is Bob and I am 26 years old.

    代码解析:

    • class Person(val name: String, var age: Int): 定义一个名为 Person 的类,它有两个参数:name(val,不可变)和 age(var,可变)。这两个参数同时也是类的属性。

    • def greet(): Unit = { ... }: 定义一个名为 greet 的方法,它没有参数,返回类型为 Unit(相当于 Java 中的 void),表示没有明确的返回值。

    • new Person("Alice", 30): 使用 new 关键字创建 Person 类的一个新对象。

  • 伴生对象(Companion Object):

    与类同名的 object 称为伴生对象。它可以包含类的静态成员(在 Scala 中没有静态成员的概念),通常用于存放工厂方法或者与类实例无关的工具方法。伴生对象和它的伴生类可以互相访问彼此的私有成员

    class Circle(val radius: Double) {
    def area(): Double = Math.PI * radius * radius
    }object Circle {
    def apply(radius: Double): Circle = new Circle(radius) // 工厂方法
    }val circle1 = Circle(5.0) // 通过伴生对象的 apply 方法创建 Circle 对象
    println(circle1.area())

    代码解析:

    • object Circle { ... }: 定义了 Circle 类的伴生对象。

    • def apply(radius: Double): Circle = new Circle(radius): 定义了一个名为 apply 的特殊方法。当像 Circle(5.0) 这样调用伴生对象时,实际上是调用了它的 apply 方法。这使得创建对象更加简洁。


七、样例类(Case Class):简洁的数据载体

样例类是一种特殊的类,它默认提供了许多有用的功能,例如:

  • 构造函数的参数自动成为类的只读属性(除非显式声明为 var)。

  • 自动生成 equals、hashCode 和 toString 方法。

  • 自动生成 copy 方法用于创建对象的副本。

  • 伴生对象会自动生成 apply 和 unapply 方法,方便对象的创建和模式匹配。

样例类非常适合用于表示不可变的数据结构。

普通类与样例类区别

  • 定义样例类:

    case class Point(x: Int, y: Int)val p1 = Point(1, 2)
    val p2 = Point(1, 2)
    val p3 = Point(3, 4)println(p1) // 输出 Point(1, 2) (toString 自动生成)
    println(p1 == p2) // 输出 true (equals 和 hashCode 自动生成,比较内容)
    println(p1 == p3) // 输出 falseval p4 = p1.copy(y = 3) // 使用 copy 方法创建 p1 的副本,并修改 y 坐标
    println(p4) // 输出 Point(1, 3)// 使用伴生对象的 apply 方法创建
    val p5 = Point.apply(5, 6)
    println(p5) // 输出 Point(5, 6)// 使用伴生对象的 unapply 方法进行模式匹配
    p1 match {
    case Point(a, b) => println(s"x: $a, y: $b") // 输出 x: 1, y: 2
    }

        


八、隐式转换(Implicit Conversions):让代码更灵活

隐式转换是 Scala 中一个强大的特性,它允许编译器在特定的上下文中自动地将一种类型的值转换为另一种类型的值。这可以帮助我们编写更简洁、更具表达力的代码。

  • 定义隐式转换: 需要使用 implicit 关键字来定义隐式转换函数。隐式转换函数必须只有一个参数。

    object StringToIntConverter {
    implicit def stringToInt(str: String): Int = str.toInt
    }import StringToIntConverter._ // 导入隐式转换val number: Int = "123" // 编译器会自动调用 stringToInt("123") 进行转换
    println(number + 1) // 输出 124

    代码解析:

  • implicit def stringToInt(str: String): Int = str.toInt: 定义了一个隐式函数 stringToInt,它接受一个 String 类型的参数 str,并返回一个 Int 类型的值。implicit 关键字表示这是一个隐式转换函数。

  • import StringToIntConverter._: 导入 StringToIntConverter 对象中的所有隐式转换。

  • val number: Int = "123": 在这里,我们尝试将一个 String 类型的值赋给一个 Int 类型的变量。由于我们导入了可以将 String 转换为 Int 的隐式转换,编译器会自动调用 stringToInt("123"),将字符串 "123" 转换为整数 123,然后赋值给 number。

  • 使用场景: 隐式转换常用于:

    • 扩展现有类的功能。

    • 提供更自然的语法。

    • 支持类型之间的自动转换。

  • 注意事项: 过度或不当使用隐式转换可能会导致代码难以理解和调试,因此需要谨慎使用。


九、类别系统

Scala 拥有一个静态的、强大的类型系统,可以在编译时捕获很多潜在的错误,提高代码的健壮性和可靠性。

  • 泛型(Generics):编写可重用的代码

    泛型允许我们编写可以应用于多种类型的代码,而无需为每种类型都编写单独的版本。

    def getFirstElement<T>(list: List<T>): Option<T> = {
    if (list.isEmpty) None
    else Some(list.head)
    }val numbersListGeneric = List(1, 2, 3)
    val firstNumber = getFirstElement(numbersListGeneric)
    println(firstNumber) // 输出 Some(1)val stringListGeneric = List("apple", "banana", "cherry")
    val firstString = getFirstElement(stringListGeneric)
    println(firstString) // 输出 Some(apple)

    代码解析:

def getFirstElement<T>(list: List<T>): Option<T>: 定义了一个泛型函数 getFirstElement,它接受一个类型为 List<T> 的参数 list,并返回一个类型为 Option<T> 的值。<T> 是类型参数,表示可以是任何类型。

  • Option 类型:处理可能缺失的值

    Option 类型用于表示一个值可能存在(Some)也可能不存在(None)。这有助于我们避免空指针异常(NullPointerException),这是很多编程语言中常见的错误。

    def findByName(name: String, people: Map<String, Int>): Option<Int> = {
    people.get(name)
    }val agesMap = Map("Alice" -> 30, "Bob" -> 25)val aliceAgeOption = findByName("Alice", agesMap)
    println(aliceAgeOption) // 输出 Some(30)
    aliceAgeOption match {
    case Some(age) => println(s"Alice is $age years old.")
    case None => println("Alice not found.")
    }val davidAgeOption = findByName("David", agesMap)
    println(davidAgeOption) // 输出 None
    davidAgeOption match {
    case Some(age) => println(s"David is $age years old.")
    case None => println("David not found.")
    }

    代码解析:

    • def findByName(name: String, people: Map<String, Int>): Option<Int>: 函数 findByName 返回一个 Option<Int>,表示找到的年龄可能是一个整数 (Some(age)),也可能没有找到 (None).

    • people.get(name): Map 的 get 方法返回一个 Option。

    • match 表达式用于处理 Option 的两种可能情况:Some(age) 表示找到了值,并将值绑定到变量 age;None 表示没有找到值。

 


结语:开启Flink之旅

掌握这些Scala基础,就像获得了打开Flink大门的钥匙🔑。接下来我们将使用这些工具构建实时数据处理流水线,让数据像河流一样在程序中自然流动。准备好了吗?让我们进入分布式计算的精彩世界!

动手练习:尝试实现一个函数,使用集合操作找出100以内所有素数的平方和。(提示:使用filtermap

// 参考答案
def primeSquares(n: Int): Int = {(2 to n).filter(isPrime).map(x => x * x).sum
}def isPrime(num: Int): Boolean = {!(2 until num).exists(x => num % x == 0)
}

如果这篇文章对你有所启发,期待你的点赞关注!

相关文章:

Scala语言基础:开启你的 Flink 之旅

引言&#xff1a;为什么选择Scala&#xff1f; 大家好&#xff0c;我是心海&#xff01; Scala&#xff08;Scalable Language&#xff09;是一门融合面向对象与函数式编程的现代语言。它像瑞士军刀一样灵活——既能编写简洁的脚本&#xff0c;又能构建复杂的分布式系统。想象你…...

C++计算机视觉实战:100个实际案例分析

【2025最新版】C计算机视觉100个案例算法汇总(长期更新版) 本文是基于C的项目实战&#xff0c;需要具备一点C基础与深度学习基础&#xff0c;并且对opencv、open3d、tensorrt、onnxruntime有一定了解。 你们的订阅是我更新的动力&#xff0c;请订阅、点赞、收藏。 1.Yolov5实…...

V-SHOW和箭头函数在VUE项目的踩坑点

v-show和v-if v-show控制显示隐藏是通过控制CSS的display决定dom节点的显示和隐藏。v-if通过控制dom节点的渲染与否实现元素的显示和隐藏。 在vue中&#xff0c;template标签不参与页面渲染&#xff0c;也不会破坏代码的层级结构&#xff0c;所以多和v-if结合控制元素的显示隐…...

vscode使用方式

一、常用快捷键与代码操作 注释与代码排版 行注释&#xff1a;Ctrl /&#xff1b;块注释&#xff1a;Shift Alt A。 代码缩进&#xff1a;选中代码段后按 Tab&#xff08;右移&#xff09;或 Shift Tab&#xff08;左移&#xff09;。 代码导航与编辑 快速跳转文件&…...

使用OpenSceneGraph生成3D数据格式文件

OpenSceneGraph (OSG) 提供了多种方式来生成和导出3D数据格式文件。以下是详细的生成方法和示例代码&#xff1a; 一、基本文件生成方法 1. 使用osgDB::writeNodeFile函数 这是最直接的生成方式&#xff0c;支持多种格式&#xff1a; #include <osgDB/WriteFile>osg:…...

网络安全应急响应-系统排查

在网络安全应急响应中&#xff0c;系统排查是快速识别潜在威胁的关键步骤。以下是针对Windows和Linux系统的系统基本信息排查指南&#xff0c;涵盖常用命令及注意事项&#xff1a; 一、Windows系统排查 1. 系统信息工具&#xff08;msinfo32.exe&#xff09; 命令执行&#x…...

如何判断JVM中类和其他类是不是同一个类

如何判断JVM中的类是否为同一个类 在Java虚拟机(JVM)中&#xff0c;判断两个类是否相同需要同时满足以下三个条件&#xff1a; 1. 类全限定名必须相同 包括包名类名的完整路径必须完全一致例如&#xff1a;java.lang.String和com.example.String被视为不同类 2. 加载该类的…...

Prolog语言的共识算法

Prolog语言的共识算法 引言 在分布式计算和区块链技术的背景下&#xff0c;共识算法作为确保节点一致性的重要机制&#xff0c;受到了广泛关注。传统的共识算法如PBFT&#xff08; Practical Byzantine Fault Tolerance &#xff09;等在许多系统中得到了应用&#xff0c;但随…...

AIDD-深度学习 MetDeeCINE 破译代谢调控机制

深度学习 MetDeeCINE 破译代谢调控机制 目录 使用 FEP/REMD 和 DFT 方法准确预测药物多靶点绝对结合自由能的新途径。Scorpio 框架利用对比学习优化核苷酸序列表示&#xff0c;提升基因组分析效率&#xff0c;尤其在未知序列的分类和泛化能力上表现出色。LPM 模型整合多模态扰…...

pyTorch框架-迁移学习-实现四种天气图片多分类问题

目录 1.导包 2.加载原数据、创建训练与测试目录路径 3.用transforms.Compose、torchvision.datasets.ImageFolder数据预处理 4.加载预训练好的模型 5.固定与修改预训练模型的参数 6.将模型拷到GPU上 7.定义优化器与损失函数 8.定义训练过程 9.测试运行 10.测试结果…...

python1(基础语法输入输出)

输入输出&#xff1a; 输出 print(*objects, sep , end\n, filesys.stdout, flushFalse) objects&#xff1a;这是一个可变参数&#xff0c;意味着你可以传入任意数量的对象。print 函数会将这些对象依次打印出来。在函数内部&#xff0c;这些对象会被转换为字符串形式。 se…...

Linux:页表详解(虚拟地址到物理地址转换过程)

文章目录 前言一、分页式存储管理1.1 虚拟地址和页表的由来1.2 物理内存管理与页表的数据结构 二、 多级页表2.1 页表项2.2 多级页表的组成 总结 前言 在我们之前的学习中&#xff0c;我们对于页表的认识仅限于虚拟地址到物理地址转换的桥梁&#xff0c;然而对于具体的转换实现…...

OpenStack Yoga版安装笔记(十七)安全组笔记

一、安全组与iptables的关系 OpenStack的安全组&#xff08;Security Group&#xff09;默认是通过Linux的iptables实现的。以下是其主要实现原理和机制&#xff1a; 安全组与iptables的关系 OpenStack的安全组规则通过iptables的规则链实现。每条安全组规则会被转换为相应的i…...

开源身份和访问管理方案之keycloak(三)keycloak健康检查(k8s)

文章目录 开源身份和访问管理方案之keycloak&#xff08;三&#xff09;keycloak健康检查启用运行状况检查 健康检查使用Kubernetes下健康检查Dockerfile 中 HEALTHCHECK 指令 健康检查Docker HEALTHCHECK 和 Kubernetes 探针 开源身份和访问管理方案之keycloak&#xff08;三&…...

棋盘问题(DFS)

在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。 要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放 kk 个棋子的所有可行的摆放方案数目 C…...

verilog学习--1、语言要素

先看一个例子 /*This is first Verilog progaram*/ timescale 1ns/1ns module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry; /**/assign #2 SumA^B;assign #5 CarryA&B&#xff1b; endmodule; Verilog以module为单位编写&#xff0c;每个文件一个module&#…...

from fastmcp import FastMCP和from mcp.server.fastmcp import FastMCP的区别是什么?

文章目录 困惑以方式一开启一个mcp server,并用cline进行调用mcp install server.py修改配置文件以方式二开启MCP server困惑 一直比较困惑的是,好像用python实现mcp server有两种实现方式。 一是使用: https://github.com/modelcontextprotocol/python-sdk 二是使用: …...

QT工程建立

打开软件新建一个工程 选择chose 工程命名&#xff0c;选择保存路径&#xff0c;可以自己选择&#xff0c;但是不要有中文路径 默认的直接下一步 任意选一个下一步 点击完成 之后是这个界面&#xff0c;点击右下角的绿色三角形编译一下 实验内容 添加类 第一个是建立cpp和.h文件…...

Day82 | 灵神 | 快慢指针 重排链表

Day82 | 灵神 | 快慢指针 重排链表 143.重排链表 143. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者直接给跪了&#xff0c;这个难度真是mid吗 直接去看灵神的视频 环形链表II【基础算法精讲 07】_哔哩哔哩_bilibili 1.简单来说就是&#xf…...

TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测(Matlab完整源码和数据)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.TCN-LSTM时间卷积长短期记忆神经网络多变量时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 2.运行环境为Matlab2023b&#xff1b; 3.data为数据集&#xff0c;输入多个特征&#xff0c;输出单个变量&a…...

语法: lcd_load( buffer_pointer, offset, length);

LCD_LOAD() 语法: lcd_load( buffer_pointer, offset, length); 参数: buffer_pointer指向发送给LCD的用户数据; offset是用来将该数据写入LCD,用作进入LCD segment memory的偏移量; length是传送的字节数. 要求: 没有. 功能: 该函数将从CPU的buffer_pointer存储区…...

分治(8题)

目录 一、快排 1.颜色分类 2.排序数组 3.数组中的第k个最大元素 4.最小的K个数 二、归并 1. 排序数组 2.数组中的逆序对 3.计算右侧小于当前元素的个数 4.翻转对 一、快排 1.颜色分类 75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; left和right&#xff0c;初…...

【9】数据结构的串篇章

目录标题 串的定义顺序串的实现初始化赋值打印串求串的长度复制串判断两个串长度是否相等连接两个串比较两个串内容是否相等插入操作删除操作调试与代码合集 串的模式匹配算法朴素的模式匹配算法KMP算法实现模式匹配 串的定义 定义&#xff1a;由0个或多个字符组成的有限序列&…...

Linux file命令

目录 一. file命令简介二. -b 输出结果不显示文件名三. --mime 输出文件的MIME类型字符串四. 批量确认文件类型4.1 -f 从指定的文件中读取文件路径&#xff0c;显示其文件类型4.2 配合find命令查找确认 一. file命令简介 由于Linux系统并不是像Windows系统那样通过扩展名来定义…...

ARM-UART

时钟选择PLCK,超时3ms自动发送&#xff0c;设置发送8位的缓冲区&#xff0c;且发送中断 设置触发深度&#xff0c;达到8字节将缓冲区数据发憷 中断处理函数...

AFT3 Engine传奇世界AFT3代引擎源码

此AFT3代引擎源码&#xff0c;不是老AFT0330版本&#xff0c;应该是WeiAFT的源码 本源码为新AFT3引擎源码&#xff0c;直接电脑打包出来&#xff0c; 现在市面上使用的AFT3引擎都是用的此款&#xff0c;下载编译即用 链接: https://pan.baidu.com/s/1Zxa64AQ7MUsdV2iIrqiTEg 提…...

[ 3分钟算法 ] | 递归搜索题目 : 翻转链表(递归版)

目录 1. 题目链接&#xff1a; 2. 思路分析&#xff1a; 思路一&#xff1a;从宏观上看 思路二&#xff1a;将链表看成一颗树 3. 代码 1. 题目链接&#xff1a; LCR 024. 反转链表 2. 思路分析&#xff1a; 思路一&#xff1a;从宏观上看 让当前节点后面的链表先逆置&…...

左值与右值,空间与数据

左值是空间&#xff0c;右值是数据 编程总是对“数据”&#xff0c;对"存放数据的空间"操作 a返回一个当前的数据&#xff0c;存放到一个临时空间中&#xff0c;自身的空间中的数据再进行运算 a直接对自身空间中的数据进行运算 其余知识&#xff1a; 1.变量名的意…...

线程池/内存池/mysql连接池

线程池介绍 ①线程池定义&#xff1a; 维持和管理固定数量线程的结构&#xff0c;用于解决资源频繁创建和销毁的问题。 ②线程池组成&#xff1a; 固定数量的线程、队列、任务状态管理。 ④线程池的作用&#xff1a; 避免频繁创建和销毁线程&#xff0c;管理线程状态&…...

图解AUTOSAR_SWS_FlexRayARTransportLayer

FlexRay AUTOSAR 传输层 (FrArTp) 分析 1. AUTOSAR FlexRay 传输层架构 1.1 FlexRay AUTOSAR 传输层在AUTOSAR架构中的位置 AUTOSAR分层架构中,FlexRay AUTOSAR 传输层(FrArTp)位于通信抽象层,其上方是PDU路由器,下方是FlexRay接口。FrArTp的主要功能是实现FlexRay网络上的…...

【百日精通JAVA | SQL篇 | 第四篇】约束

SQL这一块没什么难度&#xff0c;主要是一个熟练度&#xff0c;稍微上点难度的地方&#xff0c;其实在于查&#xff0c;比较复杂&#xff0c;涉及到很多问题。 指定列插入 使用指定列插入的时候&#xff0c;未被指定的列使用默认值进行存储&#xff0c;默认值为空。 默认值设置…...

QEMU源码全解析 —— 块设备虚拟化(16)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(15) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社...

实验:IS-IS认证。

一、IS-IS认证的定义与作用分析 ‌IS-IS认证是什么&#xff1f;‌ IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;协议是用于自治系统内部的路由协议&#xff0c;其认证机制主要用于保障路由信息交换的安全性&#xff0c;包括‌邻居关系建立‌和‌…...

11-产品经理-创建产品

在“产品”-“仪表盘”内&#xff0c;可以查看系统中关于产品及相关需求的统计。 在“产品”-“产品列表”页面&#xff0c;可以按项目集、项目查看其关联产品。还可以添加产品、编辑产品线、或者导出产品列表。 产品看板&#xff0c;通过看板方式查看产品、产品计划和产品下的…...

玄机-应急响应-入侵排查

靶机排查目标&#xff1a; 1.web目录存在木马&#xff0c;请找到木马的密码提交 查看/var/www/html。 使用find命令查找 find ./ -type f -name "*.php | xargs grep "eval("查看到1.php里面存在无条件一句话木马。 2.服务器疑似存在不死马&#xff0c;请找…...

MySQL基础知识(通俗版)

MySQL基础知识&#xff08;通俗版&#xff09; 一、MySQL基础概念 1.1 MySQL简介 想象MySQL就像一个超级大的Excel表格&#xff0c;但它比Excel更强大&#xff1a; 可以同时处理成千上万的数据可以保证数据的安全性和一致性可以支持多人同时操作可以自动备份和恢复数据 1.…...

python逆向:喜马拉雅登录案例

网址&#xff1a;登录 1. 点击到网页主页 先随便输入电话号码和密码 打开开发者工具&#xff0c;点击网络清空&#xff0c;然后点击登录发起网络请求 &#xff08;出现一个请求包&#xff0c;我们发现不是我们所需要的&#xff09; 我们进行验证滑块&#xff0c;就又出来请求…...

windows AndroidStudio上传maven中央仓库

一、插件地址&#xff1a;https://github.com/vanniktech/gradle-maven-publish-plugin?tabreadme-ov-file 二、Maven中心&#xff1a;https://vanniktech.github.io/gradle-maven-publish-plugin/central/ 2.1、中央门户帐户&#xff0c;用github账号登陆&#xff1a;gh122…...

嵌入式学习(35)-STM32F103 TXE 和TC

在USART的发送端有2个寄存器&#xff0c;一个是程序可以看到的USART_DR寄存器,另一个是程序看不到的移位寄存器,对应USART数据发送有两个标志&#xff0c;一个是TXE发送数据寄存器空&#xff0c;另一个是TC发送结束。 当USART_DR中的数据传送到移位寄存器后&#xff0c;TXE被设…...

linux Gitkraken 破解

ubuntu 安装 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客...

Qwen-Agent框架的文件相关操作:从Assistant到BasicDocQA

在前面的几篇文章如《针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析&#xff1a;Agent基类篇》 、《基于Qwen-Agent框架的Function Call及ReAct方式调用自定义工具》、 《针对Qwen-Agent框架的源码阅读与解析&#xff1a;FnCallAgent与ReActChat篇》中&#xff0c…...

2025年3月15日(5mw)

根据《NREL/TP-500-38060技术报告》&#xff0c;NREL 5-MW参考风力机的各部件质量及总体质量数据如下&#xff1a; 各部件质量数据 叶片&#xff08;Blades&#xff09; 单叶片质量&#xff1a;17,740 kg&#xff08;见表2-2&#xff09;总数&#xff1a;3片总质量&#xff1a;…...

docker mysql 笔记250406

docker mysql 笔记250406 以下是使用 Docker 运行 MySQL 的完整指南&#xff0c;包含常见配置和最佳实践&#xff1a; 1. 快速启动 MySQL 容器 docker run -d \--name mysql_db \-e MYSQL_ROOT_PASSWORDmy-secret-pw \-p 3306:3306 \mysql:8.02. 关键配置说明 2.1 环境变量&…...

ceph集群架构阐述

ceph集群架构阐述 ​ 首先&#xff0c;ceph集群也是分为客户端和服务端的&#xff0c;是一种高效的分布式存储系统&#xff0c;我们将其拆分为这两个部分来进行分析。 ​ 我大致的将服务端分为API类型、逻辑层、OSD层三个层面进行分析&#xff1b;将客户端按三种API类型挂载、…...

《Java八股文の文艺复兴》第十篇:量子永生架构——对象池的混沌边缘

目录 卷首语&#xff1a;蝴蝶振翅引发的量子海啸 第一章&#xff1a;混沌初开——对象池的量子涅槃&#xff08;深度扩展&#xff09; 第二章&#xff1a;混沌计算——对象复活的降维打击&#xff08;技术深化&#xff09; 第三章&#xff1a;量子试炼场——亿万级对象池全…...

(linux操作系统)程序地址空间

程序地址空间是什么&#xff1f; 讲这个问题之前&#xff0c;我们先来看一段熟悉的代码&#xff0c;以前学习C语言或者C语言时&#xff0c;就听说过程序内存分布&#xff0c;堆区&#xff0c;栈区&#xff0c;静态区&#xff0c;常量区&#xff0c;共享区&#xff0c;代码段&am…...

专业抑郁测试工具:让心理健康评估更简单

专业抑郁测试工具&#xff1a;让心理健康评估更简单 在这个快节奏的社会中&#xff0c;心理健康问题越来越受到人们的关注。为了帮助大家更好地了解自己的心理状态&#xff0c;我们开发了一款专业的在线抑郁测试工具。这个工具基于科学的心理量表设计&#xff0c;为用户提供准…...

C语言中单向链表:创建节点与插入新节点

一. 简介 单链表是一种常见且基础的数据结构&#xff0c;由一系列节点组成&#xff0c;每个节点包含数据和一个指向下一个节点的指针。 本文简单学习一下C语言中如何实现单项链表。 二. C语言实现单向链表 单向链表&#xff1a;单向链表是一种线性数据结构&#xff0c;由一…...

jsoncpp的使用

json提供的几个类&#xff1a; Value类&#xff1a;将json支持的数据类型进行包装&#xff0c;最终得到一个Value类型 FastWriter类&#xff1a;将Value对象中的数据序列化为字符串&#xff0c;序列化后可以得到json格式的字符串 Reader类&#xff1a;反序列化&#xff0c;将…...

【最新版】啦啦外卖v64系统独立版源码+全部小程序APP端+安装教程

一.系统介绍 啦啦外卖跑腿平台独立版&#xff0c;使用的都知道该系统功能非常强大&#xff0c;应该说是目前外卖平台功能最全的一套系统。主要是功能非常多&#xff0c;拿来即用&#xff0c;包括客户端小程序、配送端小程序、商户端小程序&#xff0c;还有对应四个端的APP源码…...