安卓开发学习---kotlin版---笔记(一)

Hello word

前言:上次学习安卓,学了Java开发,简单的搭了几个安卓界面。这次要学习Kotlin语言,然后开发安卓,趁着还年轻,学点新东西,坚持~
未来的你会感谢现在努力的你~

在这里插入图片描述

主要学习资料:

  • 《第一行代码Android 第三版》
  • 菜鸟教程
  • android官网-kotlin
  • Kotlin 官方文档 中文版
  • 2018年黑马安卓开发视频教程

那么,开始吧~

开始-Kotlin语言-安卓开发学习

首先是搭建环境,在一通操作过后,在android studio上成功安装行了kotlin
经典的:hello word

在这里插入图片描述

eclipse环境搭建结果:在这里插入图片描述


参数

又是一个绕不开的话题
kotlin中
使用val修饰的变量,是不可变的(value)
使用var修饰的变量,是可变的(variable 可变的)

  • tips: 优先使用val来声明一个变量,而当val没有办法满足你的需求时再使用var

函数的格式:

kotlin:

func 函数名(参数名: 参数类型): 返回值类型{函数体
}

oc:

- (返回值类型)函数名(参数类型: 参数名) {函数体
}

只是组合方式不一样
函数的四要素:函数名、参数、返回值类型、函数体都有

函数的简略写法:

fun sum(a: Int, b: Int): Int{return a+b
}
//如果函数体里面只有一条语句,而且该语句有返回值,则可以去掉{},并省略return,直接使用=:
fun sum2(a: Int, b: Int): Int = a+b

在kotlin中,函数和参数(变量)一样,都是一等公民
那个,也可以将函数表达式赋值给一个变量:

	///等号右边,称为:函数表达式var i = {a: Int, b: Int -> a+b}println(i(3, 8))

还有另外一种写法:

	//var j:后面,表面是一种类型,j是一个函数类型,两个入参,一个出参//=后面,是一个函数表达式var j:(Int, Int)->Int = {x, y -> x+y }println(j(1, 8))

也就是,函数也可以充当函数里面的参数,或者返回值

for循环

  • kotlin也有swift中的开区间、闭区间的概念
    四种类型:[],(),[),(]

注意,所谓 “全开区间” 或者是 “左开右闭” 的区间,可以用其他两种方式代替

	var nums = 1..10for (num in nums){print("$num, ")}println()var nums2 = 1 until 10for (num in nums2){print("$num, ")}

运行结果:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
1, 2, 3, 4, 5, 6, 7, 8, 9,

  • step n隔几个,打印1个
    for (num in 1..20 step 2){print("$num, ")}

运行结果:1, 3, 5, 7, 9, 11, 13, 15, 17, 19,

  • reversed()翻转打印
    var nums2 = 1 until 10for (num in nums2.reversed()){print("$num, ")}

运行结果:9, 8, 7, 6, 5, 4, 3, 2, 1,

list和map

使用listOf创建一个list
使用witIndex()获取index的值,然后使用(x, y)两个参数接收

	fun main(args: Array<String>){var array = listOf<String>("1", "2", "4", "9")for ((i, e) in array.withIndex()){println("$i "+"$e")}

运行结果:
0 1
1 2
2 4
3 9

//导入TreeMap包
import java.util.TreeMapfun main(args: Array<String>){//创建一个mapvar map2 = TreeMap<String, String>()//赋值map2["good"] = "好"map2["bad"] = "坏"map2["study"] = "学习"println(map2["bad"])
}

默认参数与具名参数

val PI = 3.14ffun main(args: Array<String>){//要写3.14f,3.0f,而不是3.14,3var temp = circleArea(3.14f, 3.0f)var temp2 = circleArea(radius = 3.0f)println(temp)println(temp2)
}//圆的面积
//默认Pi的值是PI
//通过在类型的后面添加 = 符号来设置参数的默认值。
fun circleArea(Pi: Float = PI, radius: Float): Float{return Pi*radius*2
}

readLine()

readLine():获取键盘输入的字,获取后是String?类型的

异常捕获try-catch

举个🌰:计算器

fun main(args: Array<String>){println("请输入第一个数字:")var a = readLine()while (a == null || a?.count() == 0){println("不能输入空值,请重新输入数字:")a = readLine()}println("请输入第二个数字:")var b = readLine()while (b == null || b?.count()==0){println("不能输入空值,请重新输入数字:")b = readLine()}try {var num1 = a!!.toInt()var num2 = b!!.toInt()var result = sum(num1, num2)println("$num1 + $num2 = $result")}catch (error: java.lang.Exception){println(error)}
}fun sum(a: Int, b: Int):Int{return a+b
}

递归

举个例子:计算n的阶层

5的阶层 = 5 * 4 * 3 * 2 * 1 = 120

fun main(args: Array<String>){println(jieCeng(5))
}fun jieCeng(a: Int):Int{//结束条件if (a == 1) return 1//递归计算return a * jieCeng(a-1)
}
尾递归计算
fun main(args: Array<String>){var result = 0println(add(100, result))
}tailrec fun add(a: Int, result: Int):Int{println("计算机第${a}次计算, result=${result}")//结束条件if (a == 0) return 1//递归计算return add(a-1, result + a)
}

继承

  • 如果想继承某个父类,则父类class前需要加open,允许被继承
  • 如果想重写父类的某个方法,则子类在同名方法前加overrid,且父类在方法前加open,允许被重写

接口和抽象类

  • 接口是事物的能力,接口用的时候:接口名即可
  • 抽象类是事物的本质,抽象类用的时候:抽象类+()

代理和委托

A委托B去做某事情
B代理A去做某事情

使用by 类名A(),就可以实现类名A里面的方法

	open class Father: IWashBowl by Son(){/**override fun wash() {println("我是爸爸,洗完一次10元")}* */}//或者这样调用
open class Father: IWashBowl by Son(){override fun wash() {println("我是爸爸,我收了妈妈的10元")Son().wash()println("我是爸爸,我不洗碗,但是赚了9元")}
}

单例

创建类的时候,不使用class修饰,而且使用object修饰,则只有一份

印章类sealed

sealed:封闭的、密封的

  • sealed class更在意类型
  • 枚举更在意数据
//跟enum类似,只有指定有限的类
sealed class Son {//记得加()class XXL(): Son()class XXM(): Son()fun sayHello(){println("hello")}
}fun main(args: Array<String>){//记得加(),才是对象var son1:Son = Son.XXL()var son2:Son = Son.XXM()var son3:Son = Son.XXM()var house = listOf<Son>(son1, son2, son3)for (v in house){if(v is Son.XXM){v.sayHello()}}
}

函数式编程

fun main(args: Array<String>){var names = listOf<String>("tom", "locy", "jack")//forEach函数names.forEach(action = haha)//闭包,匿名函数names.forEach{a -> println(a)}//闭包names.forEach{//默认参数itprintln(it)}
}//函数作为参数,前面使用var 参数名 =
//后面的函数名去掉
var haha = fun (name: String):Unit{println(name)
}

Kotlin高阶函数

一个函数,被用作参数或者返回值,则称为高阶函数

maxBy/minBy

找出数组array,里面age最大的item
array.maxBy{a.age}
找出数组array,里面height最小的item
array.minBy{a.height}

返回的是item对象

var item: Object = array.maxBy{it.age}

filter

  • 过滤找到特定条件的对象集合
    好几个条件并列执行:
var newArray = array.filter{(it.age>18) and (it.height>168) and (it.age<25)
}

map

  • 把原数组某个属性,映射成新的集合
    比如:把人群中的名字列出来,放入新的集合中
var newArray = oldArray.map{"${it.name} : ${it.age}"
}

结果:{name1: 18, name2: 30, name3: 19}

any

  • 是否有满足某个条件的对象
    返回的是一个boolean值
var temp: Boolean = array.any{it.age == 18
}

count

  • 统计符合满足条件对象的个数
var count: Int = array.count{it.age<18
}

find

  • 查找符合条件的对象,并返回第一个
var item: Object = array.finc{it.address=="北京"
}

groupBy

  • 按照特征,把对象分为不同的组
var result: Array = array.groupBy{it.address
}

按照地址,把原来的数组,分别组成新的数组

DSL 领域特定语言

  • 扩展函数
  • 中缀表达式
    函数使用infix修饰后,.的操作,可以换成空格的操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode算法之字符串

目录 1.最长公共前缀2.最长回文子串3.二进制求和4.字符串相乘 1.最长公共前缀 最长公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//法一&#xff1a;两两比较string ret strs[0];for(int i1;i<strs.size();i){ret f…

NocoBase企业级低代码开发平台有什么优势?

企业级低代码开发平台&#xff0c;作为一种新兴的技术解决方案&#xff0c;正逐渐在企业中受到越来越多的关注和青睐。它以其高效、灵活的特性&#xff0c;为企业的创新提供了更快速、更可持续的支持和推动。 低代码开发平台是一种以图形化界面为基础&#xff0c;结合拖拽式编…

Qt右键菜单+动作+qss案例

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置界面颜色样式this->setStyleSheet("background-color:rgb(54,54,54)");//创建文件菜单QMenu *fileMenuItems new QMenu;//菜单添加iconfileMenuItems->se…

如何根据接口文档,轻松快速的模拟接口服务?

什么是WireMock? WireMock 是一个Http 模拟服务,其核心也是一个web服务,WireMock主要是为特定请求提供固定的返回值。 WireMock可以作为单独进程启动,模拟一个WEB服务器,提供一些API访问,并返回特定的返回值。也可以作为第三方库在项目中使用。 如何使用 standalone方…

2161根据数字划分数组

给你一个下标从 0 开始的整数数组 nums 和一个整数 pivot 。请你将 nums 重新排列&#xff0c;使得以下条件均成立&#xff1a; 所有小于 pivot 的元素都出现在所有大于 pivot 的元素 之前 。所有等于 pivot 的元素都出现在小于和大于 pivot 的元素 中间 。小于 pivot 的元素之…

allure修改logo 自定义

无论pytest还是httprunner都适用allure生成报告。那我们就有必要对allure报告进行一些定制。我们先修改logo&#xff1a; 1、给allure.yml插件custom-logo-plugin 找到allure安装的位置&#xff0c;在config文件夹下有一个allure.yml的配置文件。打开它&#xff0c;在最后添加…

Python接口自动化测试 ---Allure报告使用详解

这一节主要是记录allure的内容以及用法&#xff0c;怎么让他生成一个完整的想要的报告。 allure生成的报告和其他五花八门的报告对比了一下&#xff0c;它的可读性是最好、最直观的。这不仅仅是我想要的效果&#xff0c;也是很多小伙伴想要的结果&#xff0c;毕竟这是给领导看…

扩散模型DDPM学习笔记

扩散模型DDPM 文章目录 扩散模型DDPM如何运作基本概念训练过程推理过程&#xff1a; 目标损失函数推导评估标准 论文地址&#xff1a; Denoising Diffusion Probabilistic Models (DDPM) 如何运作 ​ 从guassian distribution进行采样得到一个噪声的图片&#xff0c;图片大小…

为什么我不能给shopify的图片添加alt

首先我们要明白是什么ALT标签&#xff0c;为什么要添加这个标签&#xff0c;这个标签有什么用 ALT标签是什么 ALT属性是HTML的一部分&#xff0c;它为那些无法查看图像的用户提供替代的文本描述。 ALT标签有什么用 使用ALT属性还可以帮助搜索引擎爬虫更好地理解您的网站内容。有…

学习知识回顾随笔(远程连接MySQL|远程访问Django|HTTP协议|Web框架)

文章目录 如何远程连接MySQL数据库1.创建用户来运行&#xff0c;此用户从任何主机连接到mysql数据库2.使用IP地址来访问MySQL数据库 如何远程访问Django项目Web应用什么是Web应用应用程序的两种模式Web应用程序的优缺点 HTTP协议&#xff08;超文本传输协议&#xff09;简介HTT…

Airtest自动化测试工具实战演练

一开始知道Airtest大概是在年初的时候&#xff0c;当时&#xff0c;看了一下官方的文档&#xff0c;大概是类似Sikuli的一个工具&#xff0c;主要用来做游戏自动化的&#xff0c;通过截图的方式用来解决游戏自动化测试的难题。最近&#xff0c;移动端测试的同事尝试用它的poco库…

LCM-LoRA模型推理简明教程

潜在一致性模型 (LCM) 通常可以通过 2-4 个步骤生成高质量图像&#xff0c;从而可以在几乎实时的设置中使用扩散模型。 来自官方网站&#xff1a; LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 小时&#xff09;即可从任何预训练的稳定扩散 (SD) 中提取出来&#…

sed文本 免交互

目录 什么是sed 概念 格式 基本用法 命令的选项 打印第三行 打印日志文件 打印奇数行 打印偶数行 第三行退出 删除第三行 sed在不打开文件的情况下修改文件内容 在后面添加 选项a 在字符中间添加 \n 实现追加换行 全部追加 在前面插入 选项i 替换 选项c …

Java精品项目源码基于SpringBoot的智慧园区管理系统(v67)

Java精品项目源码基于SpringBoot的智慧园区管理系统(v67) 大家好&#xff0c;小辰今天给大家介绍一个智慧园区管理系统&#xff0c;演示视频公众号&#xff08;小辰哥的Java&#xff09;对号查询观看即可 文章目录 Java精品项目源码基于SpringBoot的智慧园区管理系统(v67)难度…

【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析

【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析 文章目录 【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析前言PM定位模块损失函数FM聚焦模块损失函数总结 前言 在详细解析PFNet代码之前&#xff0c;首要任务是成功运行PF…

压缩包文件丢失?4个正确找回方法分享!

“我有一个很重要的压缩包保存在电脑上&#xff0c;但是不知道为什么里面有些文件丢失了。有什么方法可以快速找回压缩文件&#xff1f;请大家给我支支招吧&#xff01;” 如果我们的文件太多&#xff0c;将它们放在压缩包中不仅能让文件更有序&#xff0c;还能更合理的节省电脑…

LD_PRELOAD劫持

LD_PRELOAD劫持 <1> LD_PRELOAD简介 LD_PRELOAD 是linux下的一个环境变量。用于动态链接库的加载&#xff0c;在动态链接库的过程中他的优先级是最高的。类似于 .user.ini 中的 auto_prepend_file&#xff0c;那么我们就可以在自己定义的动态链接库中装入恶意函数。 也…

tp8 使用rabbitMQ(3)发布/订阅

发布/订阅 当我们想把一个消息&#xff0c;发送给 多个消费者的时候&#xff0c;我们把这种模式叫做发布/订阅模式&#xff0c;比如我们做两个消费者&#xff0c;其中一个消费者把消息写入磁盘中&#xff0c;别一个消费者把消息结果输出到屏幕上&#xff0c;就要用到发布订阅模…

产品化和商品化

我们经常会在IT产业听过以下岗位&#xff1a; 1、产品序列&#xff1a;产品行销经理 2、产品序列&#xff1a;产品经理、需求分析师、产品详细设计工程师、UIUE设计师 3、产品序列&#xff1a;业务架构师、应用架构师、数据架构师、技术架构师 4、研发序列&#xff1a;创新原型…

Java 图片验证码需求分析

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 图片验证码 需求分析 连续因输错密码而登录失败时&#xff0c;记录其连续输错密码的累加次数&#xff1b;若在次数小于5时&#xff0c;用户输入正确的密码并成功登录…