安卓开发学习---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..10
    for (num in nums){
        print("$num, ")
    }
    println()
    var nums2 = 1 until 10
    for (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 10
    for (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.TreeMap

fun main(args: Array<String>){
	//创建一个map
    var map2 = TreeMap<String, String>()
    //赋值
    map2["good"] = "好"
    map2["bad"] = "坏"
    map2["study"] = "学习"
    println(map2["bad"])
}

默认参数与具名参数

val PI = 3.14f

fun main(args: Array<String>){
    //要写3.14f,3.0f,而不是3.14,3
    var 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 = 0
    println(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{
        //默认参数it
        println(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修饰后,.的操作,可以换成空格的操作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode注释插件「koroFileHeader」

前言 在vscode上进行前端开发&#xff0c;有几个流行的注释插件&#xff1a; Better CommentsTodo TreekoroFileHeaderDocument ThisAuto Comment Blocks 在上面的插件中我选择 koroFileHeader 做推荐&#xff0c;原因一是使用人数比较多&#xff08;最多的是 Better Commen…

外贸人如何优化资金管理链路,让「主子账户」助您事半功倍

如果一家外贸企业在大陆、香港同时拥有多个主体&#xff0c;该如何提升关联公司的账户管理效率&#xff1f; 使用iPayLinks主子账户功能&#xff0c;助力外贸企业轻松实现多账户资金的统一管理和掌控&#xff01; 多账户资金统一管理 1个主账户 可添加多达50个子账户 无需切…

人工智能_机器学习053_支持向量机SVM目标函数推导_SVM条件_公式推导过程---人工智能工作笔记0093

然后我们再来看一下支持向量机SVM的公式推导情况 来看一下支持向量机是如何把现实问题转换成数学问题的. 首先我们来看这里的方程比如说,中间的黑线我们叫做l2 那么上边界线我们叫l1 下边界线叫做l3 如果我们假设l2的方程是上面这个方程WT.x+b = 0 那么这里 我们只要确定w和…

亚马逊低价产品广告怎么打?亚马逊造成成本高的原因——站斧浏览器

亚马逊低价产品广告怎么打&#xff1f; 设置合适的出价&#xff1a;在低价自动广告中&#xff0c;设置适当的出价是关键。过高的出价可能导致广告成本过高&#xff0c;而过低的出价可能使广告曝光度不足。可以根据产品的竞争情况和预算来调整出价&#xff0c;找到一个平衡点。…

冲刺高端,OPPO不太OK?

所有人都知道OPPO有一个高端梦&#xff0c;而折叠屏似乎就是其弯道超车实现高端化的关键所在。然而如今看来&#xff0c;折叠屏手机在市场的表现似乎并没有成为主流&#xff0c;这或许也意味着OPPO距离自己的高端梦似乎还有些距离。 更高端&#xff0c;往往意味着更多的利润和价…

ATFX汇市:英、日、欧央行行长同日发声,均强调2%通胀目标尚未达成

ATFX动态&#xff1a;11月27日&#xff0c;英国央行行长贝利表示&#xff0c;“我们必须将&#xff08;通胀&#xff09;降到2%&#xff0c;这就是为什么我最近一直在给有关我们正在讨论降息或者我们将在可预见的未来降息的假设泼冷水&#xff0c;因为现在谈这个问题还太早”。…

Elsevier的latex模板

1.关于Elsevier的letex模板&#xff08; version 2.3 2021-05-11)一开始直接编辑出现The key ‘stm/author/&#xff1c;options&#xff1e;‘ is unknown and 的问 LaTeX Error: The key stm/author/<options> is unknown and is being ignored. 关于Elsevier的letex…

现货白银交易系统失灵了咋办?

在现货白银交易中&#xff0c;投资者常常会吐槽说&#xff0c;这个交易系统失灵了&#xff0c;并且他们还会感到很紧张&#xff0c;因为系统的失灵&#xff0c;可能意味着投资者策略不能发挥作用&#xff0c;进而出现亏损。其实&#xff0c;在网络时代&#xff0c;尤其是自动交…

IDEA不支持Java8了怎么办?

IDEA不支持Java8了怎么办&#xff1f; 01 异常发生场景 当我准备创建一个springboot项目时&#xff0c;发现Java8没了 02 问题的产生及其原因 查阅了官方文档之后&#xff0c;确认了是Spring Boot 不再支持 Java 8&#xff0c;不是我的问题&#xff0c;这一天终于还是来了 0…

filebeat(远程收集日志工具)

&#xff08;一&#xff09;filebeat 1、filebeat和logstash相同 &#xff08;1&#xff09;filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小的多 &#xff08;2&#xff09;filebeat可以运行在非Java环境、可以代理l…

初始化的内容写到析构函数中。。。。。。。

大概是&#xff0c;把应该在构造函数中初始化的堆栈窗体代码写到了析构函数中。。。。 不是因为没掌握构造/析构&#xff0c;而是。。。。 检查了四十多分钟没检查出来。。 被自己蠢哭。 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) { }…

数学老师怎么和家长沟通

作为一名数学老师&#xff0c;与家长建立良好的沟通关系是非常重要的。以下是我个人认为可以帮助与家长有效沟通的建议&#xff1a; 建立良好的第一印象 第一次与家长接触时&#xff0c;要尽可能展现出你的专业素养和热情。在交流中&#xff0c;要表达出你对孩子的关心和重视&…

全面介绍SSO(单点登录)

全面介绍SSO&#xff08;单点登录&#xff09; SSO英文全称Single SignOn&#xff0c;单点登录。SSO是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比…

vue项目通过HBuilder打包成apk,实现apk自动更新下载

vue 项目通过 HBuilder 打包成 apk&#xff0c;实现 apk 自动更新下载 1、vue 项目通过 HBuilder 打包成 apk vue 项目在终端执行 npm run build 打包成 dist 文件&#xff0c;生成的 dist 文件在 项目根目录下 在 HBuilder 中 新建一个项目 默认选择 5APP 的默认模板项目…

DDD落地:有赞的生产项目,DDD如何落地?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如有赞、阿里、滴滴、极兔、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

MS31542直流电机驱动芯片可Pin to Pin兼容GC3909

MS31542 是一个双全桥电机驱动。电源电压供电范围 4V 到 12V&#xff0c;平均电流 1.1A&#xff0c;电流峰值1.54A。如果需要更高的电流能力&#xff0c;可以将双全桥并联使用。 四个输入脚可以控制直流电机工作在正转、反转、刹车以及滑行模式&#xff0c;也可以控制一个步进电…

与中通支付对接

最近项目接入商户&#xff0c;商户需要同步给中通支付&#xff0c;报错两个异常已解决。 一、json报错 未接入中通SKD之前&#xff0c;不会报错&#xff0c;接入后&#xff0c;json转换异常。 排查后发现&#xff0c;中通的jar包里JSON版本太低&#xff0c;与自身项目的版本冲…

ARM Cortex-M核的内核态,用户态

首先&#xff0c;用户态和内核态是从操作系统层面上来划分的&#xff0c;如果没有操作系统&#xff0c;我可以直接运行在特权模式下&#xff0c;并使用特权指令。在这种情况下&#xff0c;我将负责管理和控制系统资源&#xff0c;执行关键操作&#xff0c;以及确保系统的安全性…

Surfer与Voxler数据处理及可视化

Surfer和Voxler分别是美国Golden Software 公司开发的用于二维和三维数据可视化软件&#xff0c;具有强大的数据处理和插值功能&#xff0c;软件主要应用于气象、环境和地质&#xff08;以及生物、医学等&#xff09;等领域。其中Surfer主要用于绘制二维等值线图、三维表面图以…

MySQL双主双从数据库集群搭建

1 引言 在之前的文章中提到过相关搭建方法&#xff0c;具体请参考《MySQL主从数据库搭建》这篇文章&#xff0c;本文主要讲述双主双从&#xff0c;双主多从集群的搭建方式。 这里要问一个问题&#xff0c;为什么MySQL要搭建数据库集群呢&#xff1f;我想应该有以下几点原因&…