请简述一下什么是 Kotlin?它有哪些特性?
1 JVM 语言的共性:编译成字节码文件
Kotlin 和 Java 同属于 JVM(Java Virtual Machine)语言,它们的代码最终都会被编译成 JVM 字节码(.class)文件。
编译流程:
- Kotlin 编译:Kotlin 代码(.kt 文件)—> Kotlin 编译器(kotlinc)—> JVM 字节码(.class 文件)—> JVM 执行;
- Java 编译:Java 代码(.java)—> Java 编译器(javac) —> JVM 字节码(.class 文件)—> JVM 执行;
虽然 Kotlin 的字节码(.class)文件可以反编译成 Java 代码,但结果可能不够直观。以下是用 Kotlin 实现的单例模式:
object Singleton {
}
反编译成 Java 代码:
public final class Singleton {@NotNullpublic static final Singleton INSTANCE;private Singleton() {}static {Singleton var0 = new Singleton();INSTANCE = var0;}
}
2 语法糖
2.1 扩展
2.1.1 扩展属性(Extension Properties)
扩展属性允许开发者为现有的类添加新的属性,不过这种做法并没有真正的给类添加成员变量,而是提供了自定义的 getter(val) 和 setter(var) 方法。
语法形式为: val ClassName.属性名: 类型
:
val MutableList<Int>.sum: Intget() = this.sum()fun main() {val numbers = mutableListOf(1, 2, 3, 4, 5)println(numbers.sum)
}
在上面的例子中,MutableList<Int>
是接收者类型,sum
是扩展属性名,get()
是属性的 getter 方法。
2.1.2 扩展函数(Extension Functions)
扩展函数允许开发者为现有的类添加新的函数,而无需对该类进行继承、修改或者使用装饰器模式(一种结构型设计模式,它允许向一个现有的对象中添加新的功能,同时又不改变其结构)。
语法形式为:fun ClassName.函数名(): 类型
:
fun String.reverseString(): String {return this.reversed()
}fun main() {val str = "Hello"val reversedStr = str.reverseString()println(reversedStr)
}
在上面的例子中,String 是接收者类型,reverseString
是扩展函数名。this 关键字在扩展函数中代指接收者对象。
需要注意的是:扩展函数是静态解析的,这意味着调用扩展函数是由调用函数的表达式类型决定的,而非运行时对象的类型。
场景设定 —— 扩展函数:
open class Animal
class Dog : Animal()// 扩展函数
fun Animal.speak() = println("Animal Speaks")
fun Dog.speak() = println("Dog barks")fun main() {val animal: Animal = Dog()animal.speak() // Animal Speaks
}
场景设定 —— 成员函数:
// 成员函数
open class Animal {open fun speak() = println("Animal Speaks (member)")
}class Dog : Animal() {override fun speak() = println("Dog barks (member)")
}fun main() {val animal: Animal = Dog()animal.speak() // Dog barks (member)
}
结果分析:
- 扩展函数:根据变量声明类型 Animal 调用
Animal.speak()
,忽略实际类型 Dog; - 成员函数:根据实际运行时类型 Dog 调用
Dog.speak()
,体现多态性;
2.2 Lambda 表达式,函数式编程
2.2.1 Lambda 表达式
Lambda 表达式并不是 Kotlin 的专利,Java 中也可以使用,但是有限制。
在 Java 中,Lambda 表达式主要用于简化实现单一抽象方法的接口(即函数式接口)。这是因为 Java 的系统类型需要明确的类型信息,Lambda 表达式要和特定的函数式接口类型匹配。
例如,在 Android 开发中常见的 setOnClickListener
:
// Java 示例:匿名内部类实现 OnClickListener
button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 处理点击事件}
});// 使用 Lambda 表达式简化
button.setOnClickListener(v -> {// 处理点击事件
});
只有像 OnClickListener
这种单抽象方法的接口才能使用 Lambda 表达式简化,对于多抽象方法的接口无法实现用。
同样依赖单一抽象方法接口的转换,但语法更加简洁,且对 Java 的兼容性更好:
// Kotlin 的转换 (OnClickListener 是 Java 定义的接口)
button.setOnClickListener {// 处理点击事件
}
Kotlin 同样支持对单抽象方法的接口使用 Lambda 表达式,但更推荐用闭包来实现功能。闭包是一个可以捕获其所在上下文变量的代码块,在 Kotlin 中,闭包可以独立存在,不依赖于特定接口。 例如:
fun doSomething(action: () -> Unit) {action()
}// 调用高阶函数,传入闭包
doSomething {println("执行操作")
}
这里的闭包 { printlin("执行操作") }
不依赖于任何接口,具有更高的灵活性。
Kotlin 闭包的优势:
-
更灵活的 Lambda:Kotlin 的 Lambda 可以直接捕获并修改外部变量(非 final 变量),而 Java 要求捕获的变量必须是 final:
var counter = 0 button.setOnClickListener {counter++ // 直接修改外部变量(Java 需要通过数组或对象包装) }
-
高阶函数支持:Kotlin 允许函数直接接收 Lambda,无需定义接口:
// 自定义高阶函数 fun executeAfterDelay(delay: Long, block: () -> Unit) {Handler(Looper.getMainLooper().postDelayed(block, delay)) }// 调用 executeAfterDelay(1000) { println("Hello after 1s")}
2.2.2 函数式编程
Java 8 引入的 Stream API(流式编程)为集合操作提供了强大的函数式编程能力,如对集合进行 map
、filter
、reduce
(累积操作)等操作。但在 Android 开发中,由于兼容低版本 Android 系统(Java 8 之前的版本),使用 Stream API 会受到很大的限制:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squareNumbers = numbers.stream().map(n -> n * n).collect(Collectors.toList());
System.out.println(squareNumbers); // [1, 4, 9, 16, 25]
需要注意的是:要在 Android 低版本上运行这段代码,需要额外的配置或使用第三方库。
Kotlin 为集合提供了丰富的扩展函数,功能与 Java Stream API 类似,但无需担心版本兼容性问题。
Kotlin 的集合操作可以直接在 Android 低版本上使用:
val numbers = listOf(1, 2, 3, 4, 5)
val squaredNumbers = numbers.map { it * it }
println(squaredNumbers) // [1, 4, 9, 16, 25]
Kotlin 的集合操作函数可以在任何支持 Kotlin 的 Android 版本上运行,这使得开发者可以更方便地使用函数式编程风格进行开发。
综上所述,Kotlin 在 Lambda 表达式和函数式编程方面提供了更灵活、更易用的特性,并且在 Android 开发中避免了 Java 一些特性的兼容性问题。
2.3 判空语法
Kotlin 提供了多种强大且简洁的判空语法,以增强代码的安全性,避免出现空指针异常(NullPointerException)。
2.3.1 可空类型和非空类型
在 Kotlin 中,类型默认是非空的,这意味着变量不能被赋值为 null
。若要允许变量为 null
,需要在类型后面加上 ?
来声明为可空类型:
var nonNullableStr: String = "Hello" // 非空,不能赋值为 null
var nullableStr: String? = null // 可空
2.3.2 安全调用操作符(?.
)
安全调用操作符 ?.
能在对象不为 null
时调用其方法或访问属性,若对象为 null
则直接返回 null
,不会抛出空指针异常:
val length: Int? = nullableStr?.length // 若 nullableStr 为 null,length 也为 null
2.3.3 Elvis 操作符(?:
)
Elvis 操作符 ?.
可在可空表达式为 null
时提供一个默认值:
val lengthOrDefault: Int = nullableStr?.length ?:0 // 若为 null,返回 0
2.3.4 非空断言操作符(!!
)
非空断言操作符 !!
会将可空类型转换为非空类型,若对象为 null
时则会抛出空指针异常:
val forcedLength: Int = nullableStr!!.length // 慎用!可能引发崩溃
2.3.5 let
函数结合安全调用操作符
可以使用 let
函数结合安全调用操作符,在对象不为 null
时执行一系列操作:
var nullableString: String? = "Hello"
nullalbeString?.let {// 只有当 nullableString 不为 null 时,才会执行这里的代码块println(it.length)
}nullableString = null
nullableString?.let {println(it.length)
}
2.4 默认参数,减少方法重载
在 Kotlin 中,默认参数是一种强大的特性,可以显著的减少方法重载的需求。通过对函数参数设定默认值,可以用单个函数定义覆盖多种调用场景。
当调用该函数时,如果没有为这些参数提供具体的值,就会使用默认值。这样做可以显著减少方法重载的需求,这与 Java 中为了实现不同参数组合而进行方法重载的做法形成了鲜明的对比。
Java 中需要多个重载方法:
public void showToast(String message) {showToast(message, Toast.LENGTH_SHORT);
}public void showToast(String message, int duration) {// 实际逻辑
}
Kotlin 只需要一个函数:
// Kotlin 默认参数
fun showToast(message: String,duration: Int = Toast.LENGTH_SHORT // 默认值
) {}
调用时可以选择性提供参数:
showToast("Hello") // 使用默认 duration
showToast("Hi", Toast.LENGTH_LONG) // 显式指定 duration
2.5 省略了 findViewById
Kotlin 中可以通过 Kotlin Android Extensions 或 View Binding 来省略 findViewById
的手动调用,从而简化视图绑定的代码。
2.5.1 Kotlin Android Extensions(已弃用)
Kotlin Android Extension 是早期 Kotlin 官方提供的插件,它自动为布局文件中的视图生成对应的属性,我们可以直接使用这些属性来访问视图,无需在再调用findViewById
。
第一步:添加插件,在项目的 build.gradle 文件中应用 kotlin-android-extensions 插件
plugins {id 'com.android.application'id 'kotlin-android'id 'kotlin-android-extensions'
}
第二步:布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me" />
</LinearLayout>
第三步:在代码中使用,直接使用视图的 ID 来访问视图
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 直接使用视图 ID 访问视图text_view.text = "New Text"button.setOnClickListener {// 处理按钮点击事件}}
}
需要注意的是,Kotlin-androi-Extension 已经被弃用,不再推荐使用。官方建议使用 View Binding 来替代它。
2.5.2 View Binding
View Binding 是 Android 官方推出的功能,它为每个布局文件生成一个绑定类,通过这个绑定类可以直接访问布局文件中的视图,避免了 findViewById
的使用。
第一步,开启 View Binding,在 build.gradle 文件中开启 View Binding
android {...viewBinding {enabled = true}
}
第二步,布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me" />
</LinearLayout>
第三步,在代码中使用:
class MainActivity : AppCompatActivity() {private lateinit var binding: ActivityMainBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 初始化绑定类binding = ActivityMainBinding.inflate(layoutInflater)setContentView(binding.root) // 设置根视图// 使用绑定类访问视图binding.text_view.text = "New Text"binding.button.setOnClickListener {// 处理按钮点击事件}}
}
相关文章:
请简述一下什么是 Kotlin?它有哪些特性?
1 JVM 语言的共性:编译成字节码文件 Kotlin 和 Java 同属于 JVM(Java Virtual Machine)语言,它们的代码最终都会被编译成 JVM 字节码(.class)文件。 编译流程: Kotlin 编译:Kotli…...
Post与Get以及@Requestbody和@Pathvariable标签的应用
Post的使用场景:简单来讲适用于有安全性限制的,因为post请求的内容会被存在某个封装内容中(比如表单、jason格式等),这部分内容是不会被浏览器的cache所捕捉,安全性较强。 Get的使用场景:与pos…...
基于tabula对pdf中的excel进行识别并转换成word(三)
上一节中是基于PaddleOCR对图片中的excel进行识别并转换成word优化,本节改变思路,直接从pdf中读取表格的信息,具体思路如下所述。 PDF中的表格数据如下截图所示: 一、基于tabula从PDF中提取表格 df_list tabula.read_pdf("…...
k8s集群环境部署业务系统
k8s集群环境部署业务系统,通过shell脚本整合部署过程,简化部署流程。操作流程如下: A,B为业务系统服务名。 一.部署前准备。在k8s集群各节点执行该脚本,完成业务系统镜像加载。 #!/bin/bash # 1.删除deployment ech…...
MySQL 8.4.4 安全升级指南:从漏洞修复到版本升级全流程解析
目录 二、升级前关键注意事项 1. 数据安全与备份 2. 版本兼容性与路径规划 三、分步升级操作流程 1. 环境预检与准备 2. 安装包部署 3. 强制升级组件 4. 验证与启动 一、背景与必要性 近期安全扫描发现生产环境的 MySQL 数据库存在多个高危漏洞(CVE 详情参见Oracle 官…...
“假读“操作在I2C接收流程中的原因
在I2C接收流程中,"假读"操作是NXP I2C控制器工作特性要求的必要操作,具体原因如下: // 接收函数关键代码 void i2c_master_read(I2C_Type *base, unsigned char *buf, unsigned int size) {// ...dummy base->I2DR; /* 假读 *…...
TA学习之路——2.3图形的HLSL常用函数详解
1.基本数学运算 函数作用max(a,b)返回a,b值中较大的那个min(a,b)返回a,b值中较小的那个mul(a,b两变量相乘,常用于矩阵abs(a)返回a的绝对值sqrt(x)返回x的平方根rsqrt(x)返回x的平方根的倒数degrees(x)将弧度转成角度radians(x)将角度转成弧度noise(x)噪声函数1.1 创建一个测试…...
Python数据容器:数据容器的分类、数据容器特点总结、各数据容器遍历的特点、数据容器通用操作(统计,转换,排序)
目录 数据容器的分类 数据容器特点总结 数据容器遍历的特点 通用操作 通用统计len()、max()、min() 通用转换list()、tuple()、str()、set() 通用排序sorted 数据容器的分类 分类: 是否支持下标索引 支持:列表、元组、字符串-序列类型不支持&…...
FastAPI的发展历史
参考:https://zhuanlan.zhihu.com/p/710831974 FastAPI 于 2019 年发布,由 Sebastian Ramirez 创建。他是 Pydantic 框架的创建者,也是多个开源项目的贡献者。 FastAPI 的设计初衷是为了解决 Python Web 框架在数据类型验证和文档生成方面的问…...
本地大模型编程实战(28)查询图数据库NEO4J(1)
本文将基于langchain 框架,用LLM(大语言模型)查询图数据库NEO4J。 使用 qwen2.5 做实验,用 llama3.1 查不出内容。 文章目录 安装 NEO4J准备图数据查询图数据总结代码 安装 NEO4J 参见:在windows系统中安装图数据库NEO4J 。 准备图数据 我…...
从厨房到云端:从预制菜到云原生
小美:小猿,你最近在忙什么呢?看你总是加班。 小猿:唉,公司在搞什么“云原生”改造,说是要把我们的应用搬到云上,搞得我头都大了。 小美:云原生?听起来很高大上啊&#…...
单片机-89C51部分:9、串行口通讯
飞书文档https://x509p6c8to.feishu.cn/wiki/WSh3wnADkixHspk7kc8c5esRnad 一、什么是串口?它的作用? 串行口,简称为串口,什么是串口?它的作用是什么? 两个人交流,一般通过在说话在空气中产生…...
C++程序退出时的对象析构陷阱:深度解析与避坑指南
C++程序退出时的对象析构陷阱:深度解析与避坑指南 一、从诡异案例说起:局部对象为何"神秘消失"?二、全局对象 vs 局部对象1. 全局对象生命周期2. 局部对象生命周期三、程序终止的两种姿势:exit() vs return四、atexit():最后的救命稻草1.基础用法2. 核心特性3…...
为什么 Vite 速度比 Webpack 快?
一、webpack会先进行编译,再运行,vite会直接启动,再按需编译文件。 首先看两张图,可以清晰的看到,上面的图是webpack编译过的,而下面的图是vite直接使用工程内文件。 二、区别于Webpack先打包的方式&am…...
指针变量存放在哪?
指针的存储位置取决于其声明方式和作用域,以下是详细分析: 1. 栈(Stack) 局部指针变量:在函数内部声明的指针(非静态),作为局部变量存储在栈中。void func() {int *p; // p本身存储…...
Kafka 消息可靠性深度解析:大流量与小流量场景下的设计哲学
在分布式消息系统的设计中,消息可靠性保障本质上是系统在一致性、可用性、吞吐量三者之间动态博弈的结果。Kafka作为现代流式架构的核心组件,其消息可靠性机制在不同流量场景下呈现出截然不同的设计哲学。本文将从系统设计原理层面,解构大流量…...
python数据分析(六):Pandas 多数据操作全面指南
Pandas 多数据操作全面指南:Merge, Join, Concatenate 与 Compare 1. 引言 在数据分析工作中,我们经常需要处理多个数据集并将它们以各种方式组合起来。Pandas 提供了多种强大的多数据操作方法,包括合并(merge)、连接(join)、连接(concaten…...
在K8S迁移节点kubelet数据存储目录
默认k8s节点kubelet数据目录在 /var/lib/kubelet,如果在部署前没有做好规划,其实默认就存储在系统盘/分区下了,这样会导致一个问题,如果数据量过大会导致kubelet服务异常,其次,系统盘下有一些系统服务引用&…...
k8s 学习记录 (六)_Pod 污点和容忍性详解
一、前言 在 Kubernetes 集群中,我们已经了解了节点亲和性和 Pod 亲和性,它们在 Pod 调度方面提供了很大的灵活性。今天,我们来探讨另外两个重要的概念 ——Pod 污点(Taints)和容忍性(Tolerations…...
hutools工具类中isNotEmpty与isNotBlank区分
基于以下两种情况。在判断的变量是String类型时, 判断是否为空,推荐使用isNotBlank(). 1. isNotEmpty 不会验证str中是否含有空字符串,而 isNotBlank方法会验证 public static boolean isNotEmpty(CharSequence str) {return false isEmpty…...
C#解析USB - HID手柄上摇杆按键数据
1. 了解相关知识 HID设备通信原理:HID设备通过端点报告其状态和数据,设备通过报告描述符来描述数据用途,操作系统通过这个描述符了解设备发送数据的结构。通常一个完整的报告以特定的格式从设备传输至主机。Windows API函数…...
k8s术语pod
Pod概览 理解Pod Pod是kubernetes中你可以创建和部署的最小也是最简的单位,pod代表着集群中运行的进程。 Pod中封装着应用的容器(有的情况下是好几个容器),存储、独立的网络IP,管理容器如何运行的策略选项。Pod代表着部署的一个单位:kubemetes中应用的一个实例,可能由一个…...
使用高德MCP+AI编程工具打造一个旅游小助手
开始之前,我们先来回顾一下,什么是mcp MCP(Model Context Protocol) 模型上下文协议是 2024 年 11 月由 Anthropic 公司推出并开源的一个新标准 核心内容 架构2:MCP 采用客户端 - 服务器架构。AI 应用程序(如聊天工具或 IDE&a…...
AgeTravel | 银发文娱旅游一周新鲜事
银发文娱旅游一周新鲜事 整理 | AgeClub吕娆炜 一周银发文娱旅游产业资讯速览 星期一 4月28日 1 企业动态 携程老友会联合喜悦盛年,首发“旅游兴趣课堂”模式 华寿中心“这YOUNG的老年派”合作聚焦老龄文化需求 通用技术康养Q1营收同比增长129% 2 行业风向…...
【记】Laya2.x数字末尾导致换行异常问题
文章目录 图示 图示...
jspm老年体检信息管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 信息化时代,各行各业都以网络为基础飞速发展,而医疗服务行业的发展却进展缓慢,传统的医疗服务行业已经逐渐不满足民众的需求,有些还在以线下预约的方式接待病人,特别是针对于老年体检的服务,是少之又…...
point-cloud-annotation-tool工具windows复现,史诗巨制(windows 11)
point-cloud-annotation-tool 前期准备1.安装Qt52.安装Cmake3.安装VS 20194.编译构建 VTK 8.15.安装 PCL 1.86.编译Boost 软件环境适配准备1 Boost2 VTK 开始编译开始生成 前期准备 point-cloud-annotation-tool是一款三维标注软件,本次介绍的是再windows11环境下安…...
欧拉计划 Project Euler60(素数对集合)题解
欧拉计划 Project Euler 60 题解 题干思路code 题干 思路 先欧拉筛预处理出素数,然后dfs,注意剪枝,不然太容易炸了 code //13 5197 5701 6733 8389 //26033 #include <bits/stdc.h>using namespace std;using ll long long;bool i…...
DeepSeek破界而来:重构大规模深度检索的算力与边界
深度检索技术革命:DeepSeek万亿参数框架如何突破实时召回率瓶颈 引言:当千亿参数遇见实时检索 在人工智能技术飞速发展的今天,超大规模语言模型已成为推动产业智能化的核心引擎。然而,随着模型参数量突破万亿级门槛,…...
自定义指令input中前面不能输入空格
vue3加el-input 封装自定义指令 utils/trim.ts import type { Directive, DirectiveBinding } from vue;const trim: Directive {mounted(el, binding: DirectiveBinding) {// 获取 el-input 的 DOM 节点const inputEl el.querySelector(input);if (!inputEl) {console.er…...
esp32将partitions.csv文件启用到工程项目中的配置
在ESP32项目里,partitions.csv 文件用于定义闪存的分区表,它规定了不同类型数据(如代码、文件系统、OTA 分区等)在闪存中的存储位置和大小。下面为你详细介绍如何将 partitions.csv 文件集成到工程项目中以及相应的配置步骤。 1.…...
Windows系统下,导入运行 RuoYi-Vue3 项目
基于SpringBootVue3前后端分离的Java快速开发框架 一、后端 1.git下载代码 RuoYi-Vue:RuoYi-Vue: 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统 git clone https://gitee.com/y_project/R…...
Spark 配置 YARN 模式
在大数据处理领域,Spark 是一个强大的分布式计算框架,而 YARN(Yet Another Resource Negotiator)则是 Hadoop 生态系统中出色的资源管理器。将 Spark 配置为 YARN 模式,可以充分利用 YARN 高效的资源管理和调度能力&am…...
【Linux学习笔记】进程替换和自定义shell
【Linux学习笔记】进程替换和自定义shell 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】进程替换和自定义shell前言一.进程程序替换1.1 替换原理1.2 替换函数1.2.1函数解释1.2.2命名理解 二.自主…...
HarmonyOS运动开发:如何监听用户运动步数数据
前言 在开发运动类应用时,准确地监听和记录用户的运动步数是一项关键功能。HarmonyOS 提供了强大的传感器框架,使得开发者能够轻松地获取设备的运动数据。本文将深入探讨如何在 HarmonyOS 应用中实现步数监听功能,同时分享一些开发过程中的经验和技巧,帮助你更好地理解和实…...
Vuex状态管理及其持久化使用指南
1. 安装 Vuex Vue 2 或 Vue 3 项目: npm install vuex4 # Vuex 4 兼容 Vue 2 和 Vue 3 2. 创建 Store 新建 store/index.js: import { createStore } from vuex; import createPersistedState from vuex-persistedstate; // 持久化插件// 定义子模…...
k8s学习笔记
1查看默认命名空间pod kubectl get nodes 查看所有名空间的pod kubectl get pods -A 查看所有节点node kubectl get nodes 2根据配置文件,给集群创建资源 kubectl apply -f xxxx.yaml 3查看集群部署了哪些应用? kubectl get pods -A 4生成、删除、获取所…...
HarmonyOS ArkUI安全控件开发指南:粘贴、保存与位置控件的实现与隐私保护实践
目录 安全控件1. 粘贴控件1.1 约束与限制1.2 开发步骤 2. 保存控件2.1 约束与限制2.2 开发步骤 3. 位置控件3.1 约束与限制3.2 开发步骤 安全控件 安全控件是系统提供的一组系统实现的ArkUI组件,其中保存控件在用户首次使用时,会弹出通知弹窗࿰…...
前端在平常的开发中高度还原ui图的思考规范
问题原因 我们明明按照ui测量 为什么还会出现这么多样式偏差 根据我多次的验收反馈总结如下 使用组件库 不可能所以样式覆盖复制粘贴以前的代码 样式产生偏差有些样式是继承所得 难免疏漏图片等背景问题 或者切图问题padding等结尾问题 解决方案 组件库穿透 主要样式复制粘…...
Python 数据智能实战 (2):LLM 工具箱搭建 - API/库实操与高效 Prompt 设计入门
写在前面 —— 工欲善其事,必先利其器:连接你的 Python 与 LLM 大脑,掌握“对话”的艺术 本篇博客,我们将聚焦于“工欲善其事,必先利其器”这一核心环节,带你完成以下关键任务: 选择你的 LLM “接入点”: 了解访问 LLM 的主要方式 (云 API vs. 本地模型),并为入门选…...
即时设计笔记
1. 编辑形状 1.1 连接两个锚点 如图,形状编辑模式下,想将下面图形变成闭合形状 使用【钢笔工具】选中其中一锚点,会自动伸出一条线,然后再点击另一个锚点即可 【注意】,形状闭合后,会发现无法填充颜色&am…...
“云大物智移”背景下,五年制高职计算机类高水平专业群建设方案
在信息技术革命的浪潮中,云计算、大数据、物联网、人工智能和移动互联网(简称“云大物智移”)已成为推动全球经济和社会数字化转型的关键力量。这些技术不仅重塑了产业格局,也给职业教育带来了前所未有的挑战与机遇。随着“云大物…...
docker desktop汉化
关闭Docker Desktop 在Docker安装目录找到app.asar文件并将其备份,防止出现意外。 Windows下默认为C:\Program Files\Docker\Docker\frontend\resourcesMacos下默认为/Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/ResourcesUbuntu/Debian…...
KUKA机器人快速启动设置
KUKA机器人在首次开机启动时,有时在示教器上需要进行投入运行等相关的设置。如以下相关的信息需要处理: 1、机器人系统开机后,选择T1运行模式;2、显示提示信息:“RDC 存储器和控制系统不一致什么被更换了”时…...
【Java学习】Java的CGLIB动态代理:通俗解释与使用指南
应友友的要求,本章是对于Java的CGLIB动态代理进行一个通俗的解释,希望能够帮助到奋斗的你,一起加油!!! 🌟 通俗理解CGLIB动态代理 想象你有一个玩具机器人(原始类)&…...
Python3 基础语法
编码 默认情况下,Python3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合…...
基于Lucene的多场景检索系统开发指南
基于Lucene的多场景检索系统开发指南 官网 https://lucene.apache.org/ 一、项目构建配置 (pom.xml) <dependencies><!-- Lucene核心库 --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId&g…...
SDC命令详解:使用get_nets命令进行查询
相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 get_nets命令用于创建一个线网对象集合,关于设计对象和集合的更详细介绍,可以参考下面的博客。需要注意的是,在有些工具中还存…...
MATLAB长方体磁体3D磁力线生成
代码说明: 磁体参数设置:对磁体的尺寸、磁化强度以及真空磁导率进行定义。计算网格生成:构建一个 3D 网格,同时排除磁体内部的点。磁场计算:采用等效面磁荷法来计算每个网格点的磁场。可视化: 绘制磁体的框…...
东土科技NewPre系列智能控制器的创新之旅
物流行业,作为支撑现代供应链的核心环节,正在面临效率瓶颈、人工成本上升、设备协同难等多重挑战。如何实现从自动化向智能化的转型,成为行业亟须解决的关键问题。东土科技基于NewPre3102智能控制器打造的工业AI智能机器人控制系统࿰…...