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

了解Android studio 初学者零基础推荐(2)

在kotlin中编写条件语句

if条件语句

fun main() {val trafficLight = "gray"if (trafficLight == "red") {println("Stop!")} else if (trafficLight == "green") {println("go!")} else if (trafficLight == "yellow"){println("Wait wait...")} else {println("invalid light color")}
}

when语句处理多分支

如果分支数量大于两个,尽可能使用when,提到代码的可读性。

fun main() {val trafficLight = "gray"when (trafficLight) {"red" -> println("Stop!")"green" -> println("go!")"yellow" -> println("Wait wait...")else -> println("invalid light color")}}

fun main() {val x = 3when (x) {2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")3 -> println("x is a prime number between 1 and 10.")5 -> println("x is a prime number between 1 and 10.")7 -> println("x is a prime number between 1 and 10.")else -> println("x isn't a prime number between 1 and 10.")}
}

fun main() {val x = 3when (x) {2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")else -> println("x isn't a prime number between 1 and 10.")}
}

fun main() {val x: Any = 4when (x) {2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")is Int -> println("x is an integer number, but not between 1 and 10.")else -> println("x isn't a prime number between 1 and 10.")}
}

使用if/else 和when作为表达式

fun main() {val trafficLightColor = "Black"val message = if (trafficLightColor == "Red") "Stop"else if (trafficLightColor == "Yellow") "Slow"else if (trafficLightColor == "Green") "Go"else "Invalid traffic-light color"println(message)
}
fun main() {val trafficLightColor = "Amber"val message = when(trafficLightColor) {"Red" -> "Stop""Yellow", "Amber" -> "Slow""Green" -> "Go"else -> "Invalid traffic-light color"}
}

总结

Kotlin 中使用可为null性

在kotlin中声明变量时需要立即赋值。

fun main() {var favoriteActor: String? = "Sandra Oh"val lengthOfName = favoriteActor?.length ?: 0println("The number of characters in your favorite actor's name is $lengthOfName.")
}

总结

kotlin使用类和对象

创建类的实例

定义类的方法和属性,和之前学到的定义函数和变量是一样的,不同的是要把函数和变量放在类的内部。

属性中的getter和setter函数

这两个函数主要是根据特殊要求的属性,进行操作,例如某个属性不能为负数,或者读取的某个属性一定为大写等。这种情况下就要定义可变属性。

定义可变属性的语法

如果你没有定义get /set 函数,编译器会自动生成get/set函数:

  • val 关键字开头。
  • val 类型的变量为只读变量,因此不含 set() 函数。

定义构造函数

主要构造函数:一个类只能有一个主要构造函数(在类标头中定义)。主要构造函数可以是默认构造函数,也可以是形参化构造函数。主要构造函数没有主体(表示其中不能不包含任何代码)

定义主要构造函数的完整语法如下:

辅助构造函数:一个类可以有多个辅助构造函数。您可以定义包含形参或不含形参的辅助构造函数。辅助构造函数可以初始化类,具有包含初始化逻辑的主体。如果类有主要构造函数,则每个辅助构造函数都需要初始化该主要构造函数。

定义辅助构造函数的完整代码如下:

class SmartDevice(val name: String, val category: String) {var deviceStatus = "online"constructor(name: String, category: String, statusCode: Int) : this(name,category) {deviceStatus = when (statusCode) {0 -> "offline"1 -> "online"else -> "unkown"}print("deviceStatus = ${deviceStatus}\n")}fun turnOn() {println("Smart device is turned on.${name}")}fun turnOff() {println("Smart device is turned off.${category}")}
}
fun main() {val smartTvDevice = SmartDevice(name = "apxu", category = "ok",statusCode = 1)smartTvDevice.turnOn()smartTvDevice.turnOff()
}

实现类之间的关系

继承

定义可扩展类,需要在class前面添加 open关键字:

继承语法如下所示:

SmartTvDevice的constructor定义没有指定属性是可变还是不可变的,这说明deviceName和deviceCategory形参只是constructor形参,而不是类的属性。

子类中调用父类的方法super.functionname()

父类:

open class SmartDevice(val name: String, val category: String) {var deviceStatus = "online"open fun turnOn() {deviceStatus = "on"}open fun turnOff() {deviceStatus = "off"}
}

子类:

class SmartTvDevice(deviceName: String, deviceCategory: String) :SmartDevice(name = deviceName, category = deviceCategory) {var speakerVolume = 2set(value) {if (value in 0..100) {field = value}}var channelNumber = 1set(value) {if (value in 0..200) {field = value}}fun increaseSpeakerVolume() {speakerVolume++println("Speaker volume increased to $speakerVolume.")}fun nextChannel() {channelNumber++println("Channel number increased to $channelNumber.")}override fun turnOn() {super.turnOn()println("$name is turned on. Speaker volume is set to $speakerVolume and channel number is " +"set to $channelNumber.")}override fun turnOff() {super.turnOff()println("$name turned off")}
}

可见性修饰符

public,private,protected,internal

Kotlin 提供了以下四种可见性修饰符:

  • public:默认的可见性修饰符。可让系统在任何位置访问声明。对于您想在类外部使用的属性和方法,请标记为 public。
  • private:可让系统在相同类或源文件中访问声明。

某些属性和方法可能仅在类的内部使用,而且您不一定想让其他类使用。您可以使用 private 可见性修饰符标记这些属性和方法,以确保其他类不会意外访问它们。

  • protected:可让系统在子类中访问声明。对于您想在定义它们的类及其子类中使用的属性和方法,请使用 protected 可见性修饰符进行标记。
  • internal:可让系统在相同模块中访问声明。internal 修饰符与 private 类似,但您可以从类的外部访问内部属性和方法,只要是在相同模块中进行访问即可。
为属性指定可见性修饰符

open class SmartDevice(val name: String, val category: String) {...private var deviceStatus = "online"...
}

您也可以将可见性修饰符设置为 setter 函数,并将修饰符放在 set 关键字之前。语法如下图所示:

为方法指定可见性修饰符

为构造函数指定可见性修饰符

1.修饰符在类名之后,constuctor关键字之前

2.及时构造函数没有参数,也要保留constuctor关键字和()

open class SmartDevice protected constructor (val name: String, val category: String) {...}

为类指定可见性修饰符

internal open class SmartDevice(val name: String, val category: String) {...}

理想情况下,您应努力严控属性和方法的可见性,因此请尽可能通过 private 修饰符来声明属性和方法。如果您无法确保它们私有,请使用 protected 修饰符;如果您无法确保它们受到保护,请使用 internal 修饰符;如果您无法确保它们仅在内部使用,请使用 public 修饰符。

指定适当的可见性修饰符

定义属性委托

有很多属性的内容有相同的约束,例如:音量,频道的等都是0~100之间,如果每个属性都写一个setter,就会有很多相同的代码,为了简化代码,我们可以使用委托。

定义委托语法如下:

若要实现您可以委托实现的目标类,您必须熟悉接口。

创建接口语法如下所示:

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KPropertyclass RangeRegulator(initialValue: Int,private val minValue: Int,private val maxValue: Int
) : ReadWriteProperty<Any?, Int> {var fieldData = initialValueoverride fun getValue(thisRef: Any?, property: KProperty<*>): Int {return fieldData}override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) {if (value in minValue..maxValue) {fieldData = value}}
}
class SmartTvDevice(deviceName: String, deviceCategory: String) :SmartDevice(name = deviceName, category = deviceCategory) {override val deviceType = "Smart TV"private var speakerVolume by RangeRegulator(initialValue = 2, minValue = 0, maxValue = 100)private var channelNumber by RangeRegulator(initialValue = 1, minValue = 0, maxValue = 200)...}

kotlin使用函数类型和lambda表达式

fun关键字来声明函数,使用fun关键字声明函数可供调用,函数也属于数据类型,可以将函数存储在变量中,将函数传递到函数,或从函数返回函数等。我们将即接受其他函数作为参数和/或返回函数的函数叫做高阶函数,这一切都可以通过lambda表达式来实现。

只需函数引用运算符::,语法如下:

fun main() {val trickFunction = ::trick
}fun trick() {println("No treats!")
}

使用 lambda 表达式重新定义函数

lambda表达式提供了简洁的语法定义函数,不用fun关键字。我们可以直接将lambda表达式存储在变量中,不需要对其他函数进行函数引用。

fun main() {//val trickFunction = ::trickval trickFunction = tricktrick()trickFunction()
}val trick = {println("No treats!")
}//fun trick() {
//    println("No treats!")
//}

在kotlin中使用函数类型和lambda表达式

如果需要将函数存储在变量中需要使用函数引用运算符(::)。语法如下所示:

fun main() {val trickFunction = ::trick
}fun trick() {println("No treats!")
}

使用lambda表达式重新定义函数

lambda表达式提供了简洁的语法来定义函数,无需使用fun关键字。我们可以直接将lambda表达式存储在变量中,无需对其他函数进行函数引用。

在赋值运算符(=)前面,添加var或val关键字,后跟变量名称,以供我们在调用函数时使。赋值运算符(=)后面是lambda表达时,它由一对大括号构成,大括号中的内容是函数正文。语法如下:

fun main() {val trickFunction = tricktrick()trickFunction()
}val trick = {println("No treats!")
}

将函数用作数据类型

fun main() {val trickFunction = tricktrick()trickFunction()treat()
}
val trick = {println("No treats!")
}
val treat: () -> Unit = {println("Have a treat!")
}

将函数作为返回值

语法:

fun main() {val treatFucntion = trickOrTreat(false)val trickFucntion = trickOrTreat(true)treatFucntion()trickFucntion()
}
fun trickOrTreat(isTrick:Boolean) -> Uint {if (isTrick) {return trick} else {return treat}
}
val trick = {println("No treats!")
}
val treat = {println("Have a treat!")
}

讲一个函数作为参数传递给另一个函数

fun main() {val coins: (Int) -> String = { quantity ->"$quantity quarters"}val cupcake: (Int) -> String = {"Have a cupcake!"}val treatFunction = trickOrTreat(false,coins)val trickFunction = trickOrTreat(true,cupcake)treatFunction()trickFunction()
}
fun trickOrTreat(isTrick: Boolean, extraTreat: (Int) -> String): () -> Unit {if (isTrick) {return trick} else {println(extraTreat(5))return treat}
}
val trick = {println("No treat")
}val treat = {println("Have treat")
}

可为null的函数类型

fun trickOrTreat(isTrick: Boolean, extraTreat: ((Int) -> String)?): () -> Unit {if (isTrick) {return trick} else {if (extraTreat != null) {println(extraTreat(5))}return treat}
}fun main() {val coins: (Int) -> String = { quantity ->"$quantity quarters"}val treatFunction = trickOrTreat(false, coins)val trickFunction = trickOrTreat(true, null)treatFunction()trickFunction()
}

省略lambda参数名

将lambda表达式直接传入函数

fun main() {val treatFunction = trickOrTreat(false, { "$it quarters" })val trickFunction = trickOrTreat(true, null)treatFunction()trickFunction()
}

使用尾随lambda语法

当函数类型是函数的最后一个参数时,您可以使用另一个简写选项来编写 lambda。在这种情况下,您可以将 lambda 表达式放在右圆括号后面以调用函数。语法如下图所示:

val treatFunction = trickOrTreat(false) { "$it quarters" }

使用repeat()函数

如果一个函数返回或接受另一个函数作为实参,该函数就称为高阶函数,trickOrTreat() 函数是一个高阶函数示例,因为它接受 ((Int) -> String)? 类型的函数作为参数,并返回 () -> Unit 类型的函数。

Kotlin 提供了几个有用的高阶函数,您可以利用新掌握的 lambda 知识对这些函数加以利用。

repeat() 函数就是这样一种高阶函数。repeat() 函数是使用函数表达 for 循环的简洁方式。在后续单元中,您会经常使用该函数以及其他高阶函数。repeat() 函数具有以下函数签名:

repeat(times: Int, action: (Int) -> Unit)

fun main() {val treatFunction = trickOrTreat(false) { "$it quarters" }val trickFunction = trickOrTreat(true, null)repeat(4) {treatFunction()}trickFunction()
}

相关文章:

了解Android studio 初学者零基础推荐(2)

在kotlin中编写条件语句 if条件语句 fun main() {val trafficLight "gray"if (trafficLight "red") {println("Stop!")} else if (trafficLight "green") {println("go!")} else if (trafficLight "yellow")…...

矩阵短剧系统:如何用1个后台管理100+小程序?技术解析与实战应用

引言&#xff1a;短剧行业的效率革命 2025年&#xff0c;短剧市场规模已突破千亿&#xff0c;但传统多平台运营模式面临重复开发成本高、用户数据分散、内容同步效率低等痛点。行业亟需一种既能降本增效又能聚合流量的解决方案——“矩阵短剧系统”。通过“1个后台管理100小程…...

C# 初学者的 3 种重构模式

(Martin Fowlers Example) 1. 积极使用 Guard Clause&#xff08;保护语句&#xff09; "如果条件不满足&#xff0c;立即返回。将核心逻辑放在最少缩进的地方。" 概念定义 Guard Clause&#xff08;保护语句&#xff09; 是一种在函数开头检查特定条件是否满足&a…...

MySQL 数据类型深度全栈实战,天花板玩法层出不穷!

在 MySQL 数据库的世界里&#xff0c;数据类型是构建高效、可靠数据库的基石。选择合适的数据类型&#xff0c;不仅能节省存储空间&#xff0c;还能提升数据查询和处理的性能 目录 ​编辑 一、MySQL 数据类型总览 二、数值类型 三、字符串类型 四、日期时间类型 五、其他…...

前端vscode学习

1.安装python 打开Python官网&#xff1a;Welcome to Python.org 一定要点PATH&#xff0c;要不然要自己设 点击install now,就自动安装了 键盘winR 输入cmd 点击确定 输入python&#xff0c;回车 显示这样就是安装成功了 2.安装vscode 2.1下载软件 2.2安装中文 2.2.1当安…...

自动驾驶传感器数据处理:Python 如何让无人车更智能?

自动驾驶传感器数据处理:Python 如何让无人车更智能? 1. 引言:为什么自动驾驶离不开数据处理? 自动驾驶一直被誉为人工智能最具挑战性的应用之一,而其背后的核心技术正是 多传感器融合与数据处理。 一辆智能驾驶汽车,通常搭载: 激光雷达(LiDAR) —— 3D 环境感知,…...

从电商角度设计大模型的 Prompt

从电商角度设计大模型的 Prompt&#xff0c;有一个关键核心思路&#xff1a;围绕具体业务场景明确任务目标输出格式&#xff0c;帮助模型为运营、客服、营销、数据分析等工作提效。以下是电商场景下 Prompt 设计的完整指南&#xff0c;包含通用思路、模块范例、实战案例等内容。…...

利用 SQL Server 作业实现异步任务处理:一种简化系统架构的实践方案

在中小型企业系统架构中&#xff0c;很多业务场景需要引入异步任务处理机制&#xff0c;例如&#xff1a; 订单完成后异步生成报表&#xff1b; 用户操作后触发异步推送&#xff1b; 后台批量导入数据后异步校验&#xff1b; 跨系统的数据同步与转换。 传统做法是引入消息…...

平安健康2025年一季度深耕医养,科技赋能见成效

近日&#xff0c;平安健康医疗科技有限公司&#xff08;股票简称“平安好医生”&#xff0c;1833.HK&#xff09;公布截至2025年3月31日止三个月的业绩报告&#xff0c;展现出强劲的发展势头与潜力。 2025年一季度&#xff0c;中国经济回升向好&#xff0c;平安健康把握机遇&a…...

Index-AniSora技术升级开源:动漫视频生成强化学习

B站升级动画视频生成模型Index-AniSora技术并开源&#xff0c;支持番剧、国创、漫改动画、VTuber、动画PV、鬼畜动画等多种二次元风格视频镜头一键生成&#xff01; 整个工作技术原理基于B站提出的 AniSora: Exploring the Frontiers of Animation Video Generation in the So…...

LLVM编译C++测试

安装命令 sudo apt install clang sudo apt-get install llvm 源码 hello.cpp #include <iostream> using namespace std; int main(){cout << "hello world" << endl;return 0; }编译 clang -emit-llvm -S hello.cpp -o hello.ll 执行后&#…...

ubuntu24.04+RTX5090D 显卡驱动安装

初步准备 Ubuntu默认内核太旧&#xff0c;用mainline工具安装新版&#xff1a; sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用内核列表 mainline install 6.13 # 安装…...

MATLAB贝叶斯超参数优化LSTM预测设备寿命应用——以航空发动机退化数据为例

原文链接&#xff1a;tecdat.cn/?p42189 在工业数字化转型的浪潮中&#xff0c;设备剩余寿命&#xff08;RUL&#xff09;预测作为预测性维护的核心环节&#xff0c;正成为数据科学家破解设备运维效率难题的关键。本文改编自团队为某航空制造企业提供的智能运维咨询项目成果&a…...

鸿蒙应用开发:Navigation组件使用流程

一、编写navigation相关代码 1.在index.ets文件中写根视图容器 2.再写两个子页面文件 二、创建rote_map.json文件 三、在module.json5文件中配置路由导航 子页配置信息 4.跳转到其他页面 但是不支持返回到本页面的 用以下方式 以下是不能返回的情况 onClick(()>{this.pag…...

javaweb的拦截功能,自动跳转登录页面

我们开发系统时候&#xff0c;肯定希望用户登录后才能进入主页面去访问其他服务&#xff0c;但要是没有拦截功能的话&#xff0c;他就可以直接通过url访问或者post注入攻击了。 因此我们可以通过在后端添加拦截过滤功能把没登录的用户给拦截下来&#xff0c;让他去先登录&#…...

【Linux】系统在输入密码后进入系统闪退锁屏界面

问题描述 麒麟V10系统&#xff0c;输入密码并验证通过后进入桌面&#xff0c;1秒左右闪退回锁屏问题 问题排查 小白鸽之前遇到过类似问题&#xff0c;但是并未进入系统桌面内直接闪退到锁屏。 之前问题链接&#xff1a; https://blog.csdn.net/qq_51228157/article/details/140…...

当物联网“芯”闯入纳米世界:ESP32-S3驱动的原子力显微镜能走多远?

上次咱们把OV2640摄像头“盘”得明明白白&#xff0c;是不是感觉ESP32-S3这小东西潜力无限&#xff1f;今天&#xff0c;咱们玩个更刺激的&#xff0c;一个听起来就让人肾上腺素飙升的挑战——尝试用ESP32-S3这颗“智慧芯”&#xff0c;去捅一捅科学界的“马蜂窝”&#xff0c;…...

微信小程序webview与VUE-H5实时通讯,踩坑无数!亲测可实现

背景&#xff1a;微信小程序、vue3搭建开发的H5页面 在微信小程序开发中&#xff0c;会遇到嵌套H5页面&#xff0c;H5页面需要向微信小程序发消息触发微信小程序某个函数方法&#xff0c;微信开发文档上写的非常不清楚&#xff0c;导致踩了很多坑&#xff0c;该文章总结可直接使…...

Web请求与相应

目录 HTTP协议 一、协议基础特性 二、协议核心组成 三、完整通信流程&#xff08;TCP/IP层&#xff09; 1. 基础方法 2. 扩展方法 3. 安全性与幂等性 4. 应用场景示例 三、关键版本演进 四、典型工作流程 HTTP状态码 一、状态码分类体系 二、详细状态码表格&#…...

LeetCode222_完全二叉树的结点个数

LeetCode222_完全二叉树的结点个数 标签&#xff1a;#位运算 #树 #二分查找 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签&#xff1a;#位运算 #树 #二分查找 #二叉树 Ⅰ. 题目 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&…...

STM32之温湿度传感器(DHT11)

KEIL软件实现printf格式化输出 一般在标准C库是提供了格式化输出和格式化输入等函数&#xff0c;用户想要使用该接口&#xff0c;则需要包含头文件 #include &#xff0c;由于printf函数以及scanf函数是向标准输出以及标准输入中进行输出与输入&#xff0c;标准输出一般指的是…...

在微创手术中使用Kinova轻型机械臂进行多视图图像采集和3D重建

在微创手术中&#xff0c;Kinova轻型机械臂通过其灵活的运动控制和高精度的操作能力&#xff0c;支持多视图图像采集和3D重建。这种技术通过机械臂搭载的光学系统实现精准的多角度扫描&#xff0c;为医疗团队提供清晰且详细的解剖结构模型。其核心在于结合先进的传感器配置与重…...

2025版 JavaScript性能优化实战指南从入门到精通

JavaScript作为现代Web应用的核心技术&#xff0c;其性能直接影响用户体验。本文将深入探讨JavaScript性能优化的各个方面&#xff0c;提供可落地的实战策略。 一、代码层面的优化 1. 减少DOM操作 DOM操作是JavaScript中最昂贵的操作之一&#xff1a; // 不好的做法&#x…...

FluxCD入门操作文档

文章目录 FluxCD使用文档一、入门1.1 什么是FluxCD1.2 什么是GitOps1.3 什么是持续交付1.4 什么是**Source(源)**1.5 **什么是Reconciliation(协调)**1.6 什么是**Kustomization****与 kustomize 工具的区别**1.7 什么是**Bootstrap(引导)**1.8 安装Flux CLI1.9 配置flux…...

DOM API-JS通过文档对象树操作Doc和CSS

还记得我在之前的前端文章里面老是提及的 DOM 吗&#xff0c;当时只是简单介绍了它的组成以及作用&#xff0c;今天我们就来详细聊聊 Web浏览器 先来聊聊web浏览器&#xff0c;web浏览器是非常复杂的软件&#xff0c;有许多活动部件&#xff0c;许多部件并不能由开发者通过 J…...

实现了TCP的单向通信

1. 客户端代码:Client.java package com.xie.javase.net1;import java.io.*; import java.net.*;public class Client {public static void main(String[] args) {Socket socket = null;BufferedWriter bw = null;try {// 1. 获取本机IP地址对象InetAddress localHost = Inet…...

PostgreSQL中通过查询数据插入到表的几种方法( SELECT INTO和INSERT INTO ... SELECT)

使用 SELECT INTO 创建新表 在PostgreSQL中,SELECT INTO语法有两种主要用途:创建新表和将查询结果存储到变量中(在PL/pgSQL函数或存储过程中)。以下是详细介绍: 1. 创建新表并复制数据(类似SQL标准) SELECT * INTO new_table FROM existing_table WHERE condition;说…...

STM32项目实战:ADC采集

STM32F103C8T6的ADC配置。PB0对应的是ADC1的通道8。在标准库中&#xff0c;需要初始化ADC&#xff0c;设置通道&#xff0c;时钟&#xff0c;转换模式等。需要配置GPIOB的第0脚为模拟输入模式&#xff0c;然后配置ADC1的通道8&#xff0c;设置转换周期和触发方式。 接下来是I2C…...

CYT4BB Dual Bank - 安全启动

本节介绍TRAVEO™ T2G微控制器(MCU)的启动顺序。有关TRAVEO™ T2G微控制器的安全特性、不同的生命周期阶段以及“安全启动”序列的详细描述,请参阅 AN228680 -Secure system configuration in TRAVEO™ T2G family.   TRAVEO™ T2G微控制器(MCU)的启动序列(见图3)基于…...

Windows系统下MySQL 8.4.5压缩包安装详细教程

一、MySQL 8.4.5新特性概览 相较于旧版本&#xff0c;MySQL 8.4.5在性能与功能上实现了显著提升&#xff1a; 性能优化&#xff1a;官方测试显示&#xff0c;在高并发场景下&#xff0c;其读写性能较5.7版本提升近2倍&#xff0c;尤其在处理热点数据竞争问题时表现更为出色。…...