《Kotlin入门实战》CH2 | Kotlin 语法基础

Kotlin协程高并发服务器:四种核心模式与性能优化实战 并发编程是现代服务端开发的核心技术,通过合理利用计算资源提升系统吞吐量。Kotlin协程基于挂起函数和状态机机制,在用户态实现轻量级线程切换,避免了传统线程模型的内存开销和上下文切换成本。这种非阻塞并发模型特别适合I/O密集型场景,能够显著提升资源利用率和系统性能。在实际工程实践中,开发者需要掌握每请求一协程、生产者-消费者等核心模式,并注意调度器选择和资源管理。针对高并发服务器场景,Kotlin协程提供了结构化并发和背压处理等机制,帮助构建稳定高效的服务端应用,解决传统多线程模型在应对高并发请求时的性能瓶 阅读详情

写在前面

kotlin 为啥用fun声明方法?
JetBrains : We use “fun” because we like it - and yes, we do know what the word means in English.

8923455-b26ff83af8fc0f29.png

JVM语言生态

8923455-b26ff83af8fc0f29.png

需要注意的式Kotlin是基于JVM的语言,而不是基于Java的语言,他们都可以翻译成Class字节码。

kotlin

1.变量和标识符

  • val 只读,相当于Java中的final修饰变量
  • var可写
val pi = 3.14
pi = 3  // error val 初始化之后不能修改内容

另外Kotlin支持类型推断

var pi : Int = 3.14 // 完整写法
var pi = 3.14       // 根据初始化推断出变量的类型

2. 关键字和修饰符

修饰符按照修饰的内容可分为:类修饰符,成员修饰符,访问权限修饰符,协变逆变修饰符,函数修饰符等

类修饰符

类修饰符说明
abstract抽象类
final不可继承的final类
enum枚举类
open可继承open类
annotation注解类
sealed密封类
data数据类

成员修饰符

成员修饰符说明
override重写函数/方法
open声明函数可以被重写
final声明函数不可重写
abstract声明函数为抽象函数
lateinit延迟初始化

访问权限修饰符

访问权限修饰符说明
private私有,当前类访问
protected当前类,派生类访问
public默认值,对外可访问
internal模块类可访问

协变逆变修饰符

协变逆变修饰符说明
inout T 相当于 ? extends T
outin T 相当于 ? super T

函数修饰符

函数修饰符说明
tailrec尾递归
operator运算符重载
infix中缀函数
inline内联函数
external外部函数
suspend挂起协程函数

属性修饰符

属性修饰符说明
const常量修饰符
vararg变长参数
noinline 
crossinline 

具体化类型修饰符

具体化类型修饰符说明
reified具体化类型参数

特殊语义关键字

关键字说明
is类型判断
object单例类声明
when条件判断,相当于witch
by委托类或属性
init初始化代码块
get/setget/set函数

*省去一些Java中出现的操作符

3. 流程控制语句

3.1 分支语句

  • if : if语句可以有返回值

    fun max(a:Int , b:Int) : Int{
        val max = if(a>b){
            println("Max is a")
            a
        }else{
            println("Max is b")
            b
        }
        return max
    }
    
    // 所以可以使用Kotlin if-else代替三元运算符
    
    text = if(condition) "true" else "false"

 

  • when :相当于switch-case

    fun casesWhen(obj : Any?){
        when(obj){
            0,1,2,3,4,5,6,7,8,9 -> println("数字")
            "hello" -> println("字符串Hello")
            is char -> println("char 数据类型")
            else -> println("其他类型") // 相当于default
        }
    }
    // 上面每个case都相当于枚举
    // case 还可以使用 in/!in 判断是否在区间
    when(x){
        in 1..10 -> println("x is in range 1 to 10")
        ! in 1..10 -> println("x is not in range 1 to 10")
        else  -> println("kotlin 666")
    }
    
    // 计算n!阶乘
    fun fact(i: Int): Int {
        return when (i) {
            0, 1 -> 1;
            else -> i * fact(i - 1)
        }
    }
    

3.2 循环结构

for 循环

// for in 循环
for(i in arr){
    println(i)
}
// 索引循环,替代了传统的for(;;)循环
for(i in array.indices){
    println(array[i])
}
// index-value 循环
for((index,value) in array.withIndex()){
    println("元素$value的下标是$index")
}
// ranges 表达式循环
for(i in 1..10){
    println(i)
}
{1..10}.forEach(print(it))

do-while/while循环

和java使用方法一样

3.3 跳转语句

return

  • return

  • = :fun max(a : Int, b: Int) = if(a>b) a else b ' = '作为函数返回值

  • 匿名函数 val sum = fun(a:Int , b : Int) = a+b

  • Lambda表达式:val sumf = fun(a: Int, b Int) = {a+b},调用lambda表达式返回的是一个函数`

    val sumf = fun(a:Int, b:Int) = {a+b}
    
    sumf(1,1) // 返回的是一个函数() - > Kotlin.Int
    sumf(1,1).invoke()    // 调用这个函数
    sumf(1,1)()       // 和invoke效果一样
    

return在匿名函数和lambda表达式中作用不同

val intArray = intArrayOf(1,2,3,4,5)
intArray.forEach{
    if(it == 3) return
    println(it)
}
// 1,2
// 从lambda中return,lambda结束
intArray.forEach(fun(a:Int){
    if(a == 3) return;
    println(a)
})
// 1 2 4 5
// 从函数中return,函数执行结束

标签

val intArray = intArrayOf(1,2,3,4,5)
// 显式标签
intArray.forEach here@{
    if(it == 3) return @here
    println(it)
}
//隐式标签
intArray.forEach{
    if(it == 3) return @forEach
    println(it)
}

throw

    val ex: Nothing = throw Exception("YYYYY") // 返回的类型式Nothing,不能作为函数的参数

4.运算符重载

和C++ 中比较类似,需要区别的式C++中重载'+/-/*/等'就是 operator后面加对应的符号就行了。但是kotlin中需要写对应的操作符

data class Point(val x: Int, val y : Int)
// 重载单目运算符 '-',就是重写操作符unaryMinus
operator fun Point.unaryMinus() = Point(-x,-y)

@RunWith(JUnit4::class)
class OperatorDemoTest{
    @Test
    fun test(){
        val p = Point(1,1)
        val np = -p
        println(np)     //输出 Point(x=-1, y=-1)
    }
}

运算符和操作符的对应关系

运算符操作符
+TT.unaryPlus()
-TT.unaryMinus()
!TT.not()
T++T.inc()
a--T.dec()
T + ET.plus(E)
T - ET.minus(E)
.... 略 

=== 和 !== 不可重载

5. 包声明

kotlin中目录与包的结构无需匹配,源代码可以在文件系统的任意位。

kotlin会默认导入一些基础包到每个kotlin文件中

kotlin.*                    // Int、Long等数据类型
kotlin.annotation.*         // 注解
kotlin.collections.*        // 集合
kotlin.comparisons.*        
kotlin.io.*                 // 输入输出
kotlin.ranges.*             //
kotlin.sequences.*          
kotlin.text.*

// JVM平台默认包
java.lang.*
kotlin.jvm.*

// js 平台
kotlin.js.*

6. 数组元素的操作

Kotlin中没有使用C风格的数组,取而代之的是IntArray,LongArray...和Array<>类。

var longArray = longArrayOf(1,2,3)
var stringArray = arrayOf("how","are","you")

 

Kotlin与Java的相互调用 Kotlin调用java public class MyJavaClass{ public static MyJavaClass object = new MyJavaClass(); @Override public String toString(){ return "MyJavaClass{}"; } } kotlin fun main(args: Array<String>){ //需要加反引用符号,!左侧的按键 阅读详情

相关推荐

CocosCreator 面试题(十七)Cocos creator 固定宽度与固定高度的底层原理是什么?Cocos creator是如何做适配的?

通过固定宽度或固定高度的适配方式,可以使游戏在不同屏幕尺寸上保持一定的一致性,确保游戏中的元素的大小和位置相对稳定。具体选择哪种适配方式取决于你的游戏需求和设计考虑。在 Cocos Creator 中,你可以通过设置「设计分辨率」和使用相对坐标和布局方式来实现固定宽度或固定高度的适配。总之,Cocos Creator 提供了多种适配方式和工具,帮助你在不同屏幕尺寸上保持游戏画面的一致性。在 Cocos Creator 中,固定宽度和固定高度是两种常见的适配方式,用于在不同屏幕尺寸上保持游戏画面的一致性。

w风雨无阻w的专栏 1687

Kotlin协程入门

1、概述 最开始准备学习协程的时候,网上铺天盖地的文章都在宣传“Kotlin协程是一种轻量级的线程”,因为官方确实也是这么说的。我非常疑惑,因为从语文的角度分析,去掉定语之后,就是“协程是线程”。既然协程是线程,那么线程是变成协程之后,怎么就轻量级了呢,是占用的资源少了?学完之后发现,其实协程的本质是个异步框架,只是与RxJava等其他异步框架不同的是,它是语法级别的异步框架,也可以说是一个更方便的线程API集合。用不用协程对于资源开销来说是没什么区别的,与使用线程池相关API相比也没有明显的效率上的区别,

614

利用netmq在相机应用于unity之间传输图像数据

Unity工业相机接入方案解析 本文探讨了在Unity中接入不同品牌工业相机的技术方案。研究发现: Basler相机可直接调用官方DLL(pylonc.net.dll)实现接入 海康和大恒相机因驱动DLL依赖C++组件,无法直接调用 解决方案:通过独立进程(相机应用程序)与Unity进行通信,采用NetMQ实现图像数据传输 技术实现要点: 相机端:使用PublisherSocket发布JPEG图像帧 Unity端:通过SubscriberSocket订阅图像数据 优化:设置高水位线控制缓存帧数,避免数据堆积

weixin_46450859的博客 417

kotlin 学习之路之初学项目

otlin一个练习项目,实现三个功能,1、浏览Android技术干货 2、浏览福利,可保存福利到本地 3、可以选择分类来浏览相关技术干货 目的是尽量吧Android比较简单常用的东西练习一遍button点击,textview显示,列表显示,保存到sd卡,viewpager滑动,网络请求,图片显示,图片可以缩放,webview的使用,数据解析什么的等等。

dreamlivemeng的博客 1382

本地部署 Bolt.new - 小学生都能轻松搭建AI编程环境

本地部署 Bolt.new - 小学生都能轻松搭建AI编程环境

engchina的专栏 8624

Python Opencv cv2提取图像中某种特定颜色区域(例如黑字白纸背景下的红色公章提取),并将纯色背景透明化

拜拜PHOTOSHOP- 领导突然让我帮他把公章从图片中抠出来,在确保了不是要做坏事的情况下,我打开了PHOTOSHOP,用魔棒工具一点一点抠,但由于魔棒工具的原理是对比临近区域像素差值,导致封闭字体中的区域无法剔除,而且一点一点抠非常麻烦,愤而PYTHON,使用CV2完美解决。 效果如下(马赛克是我添加的): 任务就是把蓝色的公章抠出来。 效果如上。 代码如下: import cv2 import numpy as np src = cv2.imread(r"imagepath")#这里填你的原图像路

qq_43670549的博客 1万+

Kotlin Android 实战(一)闪屏页面

看了一些kotlin的语法,但是总觉得不真正写一下不行。 听说kotlin和java完全兼容,写了写发现,最小单位是类(java类中不能写kotlin代码,反之亦然)。 想在新项目中尝试一下的同学不要有顾虑,就像当初使用mvvm,mvp一样,实在不行在换回java呗(哈哈哈)。 本篇从kotlin安装开始到编写一个简单的闪屏页面练练。 首先AS安装kotlin插件: 然后

geanwen的博客 3214

手把手教你用Pico4UE搭建100平米VR大空间:从设备检查、系统升级到地图绘制全流程

本文详细介绍了使用Pico4UE搭建100平米VR大空间的完整流程,包括设备检查、系统升级、地图绘制和性能优化等关键步骤。通过实战案例和专业技术建议,帮助用户高效部署企业级VR解决方案,适用于展厅漫游、工业仿真等多种场景。

weixin_28273593的博客 501

C++学习笔记19——函数的定义及其调用

函数 概述 作用:将一段经常使用的代码封装起来,减少重复代码 一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能 函数的定义 函数的定义主要有五个步骤 1.返回值类型 2.函数名 3.参数表列 4.函数体语句 5.return表达式 语法: 返回值类型 函数名(参数列表){ 函数体语句 return表达式 } 案例:实现一个加法函数,传入两个整型数据,计算数据相加的结果,并且返回 示例: ```cpp #i

weixin_49522114的博客 331

GEE生物量预测:利用多源遥感数据和随机森林算法RF构建地上生物量(AGB)预测模型,并实现未来年份的生态变化模拟(大面积生物量反演)

数据融合策略:整合5类遥感产品(AGB、NDVI、LAI、土地覆盖、地形)时序特征构建:采用生长季中值法降低云污染影响机器学习优化分层采样保证数据代表性80棵决策树平衡精度与效率预测可靠性基准期R²达0.76需结合地面实测数据校正。

此星光明博客 419

这款值68亿的游戏,你不实战一下吗?安排!

本文介绍了如何使用Cocos开发传送带像素消除类游戏。游戏包含像素画、传送带、炮台等核心元素,需要先解析图片生成像素数据,再通过关卡编辑器设计关卡机制。炮台会在传送带上环绕运动,发射子弹消除匹配颜色的像素点。文章详细讲解了游戏对象实现方法,包括像素生成、传送带运动轨迹、炮台瞄准算法等,并展示了实战效果。完整源码已集成到亿元Cocos小游戏实战合集中,适合对像素消除游戏开发感兴趣的开发者参考。

lsw_Cs的博客 438

《Kotlin入门实战》CH7 | 集合类

集合类 在Java类库中有一套相当完整的容器集合类来持有对象。Kotlin没有去重复造轮子(Scala则是自己实现了一套集合类框架),而是在Java类库的基础上进行了改造和扩展,引入了不可变集合类,同时扩展了大量方便实用的功能,这些功能的API都在kotlin.collections包下面。 集合类概述 集合层次 Iterable 可遍历...

落红不是无情物 168

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《Kotlin入门实战》CH5 | 函数与函数式编程

函数与函数式编程 函数式编程与命令式编程最大的不同是:函数式编程的焦点在于数据的映射,命令式编程(imperative programming)的焦点是解决问题的步骤。 函数式编程和命令式编程比较 fun main() { val list = listOf<Int>(1, 2, 3, 4, 5) // 函数式编...

落红不是无情物 202

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《Kotlin入门实战》CH9 | 文件IO,正则和多线程

文件IO,正则和多线程 得益于kotlin的扩展函数,kotlin对java中api进行了改进,对于java中好用的api直接使用,对于不好用的api进行了扩展和改进。 1 文件IO操作 读写 fun main() { val f = File("test.txt") // 写入文件 f.writeText("hello kotl...

落红不是无情物 278

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《Kotlin入门实战》CH3 | 类型系统与可空类型

类型系统与可空类型 Kotlin属于静态类型编程语言,编程语言中类型系统定义: 如何将数值和表达式归为不同类型 如何操作这些类型 这些类型之间如何相互作用 类型系统 1. 类型系统作用 让编译器检查无意义、无效、类型不匹配的错误代码 代码更好读懂 利于抽象 char[] str = {'a','b','c'}抽象为String str = 'abc'...

落红不是无情物 159

《Kotlin入门实战》CH6 | 扩展函数与扩展属性

扩展函数与属性 在Java中获取String中的第一个字符,StringUtil.firstChar(str)可能是这样写的,但是要想`"ABC".firstChar()是不可能的,因为Java中String是final类,在Kotlin中就不一样了。 1. 扩展函数 给String类中添加firstChar方法 fun String.firstChar(...

落红不是无情物 179

《Kotlin入门实战》CH4 | 类与面向对象编程

类与面向对象编程 从面向过程到面向对象,再到设计模式,架构设计,面向服务,Sass、Pass和Iass等思想,各种软 件理论思想五花八门,但万变不离其宗: 你要解决一个什么样的问题? 你的问题是哪个领域的? 你的模型(数据结构)是什么? 你的算法是什么? 你对这个世界的本质认知是怎样的? 你的业务领域的逻辑问题、流程是什么? 声明类 1. 空类 2. ...

落红不是无情物 186

《Kotlin入门实战》CH8 | 泛型

泛型 泛型是在Java5中引入的,泛型让集合框架可以重用代码,在没有泛型时候,集合框架中存储数据的类型都是Object,也就是说存入和取出数据都需要对对象进行强制类型转换。这就很可能出现错误。 1 类接口函数上使用泛型 泛型接口 interface Send<T>{ fun handleMessage(t : T) : T; } fu...

落红不是无情物 164

GBrain 的 resolve-before-asking 技能:耗尽大脑检索链再打扰用户的身份问题门控实践

本技能是 GBrain(Garry's Opinionated OpenClaw/Hermes Agent Brain)中一个身份识别问题门控(identity-question gate):任何"X 是谁?""Ta 和你什么关系?"的问题在到达用户之前,必须先跑完大脑的完整检索链——思考 → 搜索+读页 → 挂载源查询 → 时间线/图谱 → 网络。只有全部升级失败后才能询问用户,且必须带着假设去

gitblog_00359的博客 797

SpringBoot引入海康CH-HCNetSDKV IllegalArgumentException: LoggerFactory is not a Logback LoggerContext

SpringBoot引入海康CH-HCNetSDKV6.1.6.45 项目运行bug解决。Exception in thread "main" java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath.

简介 2123

Java/Kotlin TCP Socket TLS/SSL加密通讯实战指南

在网络编程中,TCP Socket是实现客户端与服务器端稳定双向通讯的基础技术。然而,明文传输的数据在公网环境中面临被截获和窃取的风险,因此数据加密成为保障通讯安全的核心原理。TLS/SSL协议作为业界标准,通过非对称加密进行密钥交换、对称加密保障传输效率,并利用数字证书实现身份认证,为数据传输提供了机密性、完整性和可信性三重保障。这一技术价值在于,它能有效防止中间人攻击和数据泄露,是构建安全网络应用的基石。在Java/Kotlin开发实践中,通过SSLSocket和SSLServerSocket可以便捷地

weixin_33845881的博客 527

Java中也能用Kotlin断言库?Atrium Java互操作完整指南

**Atrium** 是一个面向 Kotlin 的多平台断言/期望(expectation)库,支持 JVM、JS 和 Android。对拥有 Java 代码的开发者来说,Atrium 的 Java 互操作能力尤其值得关注:它既能帮你优雅地测试 Java 类型的返回值,又原生支持 Java 9+ 的模块系统(JPMS)。本文就是这份 **Atrium Java 互操作完整指南**,带你快速上手。?

gitblog_00573的博客 444

CH34xUART 1.0.0 安卓库集成实战:适配Android 13,修复3个关键Bug

本文详细介绍了CH34xUART 1.0.0安卓库的集成实战,重点讲解了如何适配Android 13并修复3个关键Bug。内容涵盖现代Android开发环境配置、USB权限管理、串口参数设置以及性能优化技巧,帮助开发者高效实现USB串口通信功能。

weixin_30603633的博客 388

Kotlin多平台断言库Atrium完全指南:为什么它比AssertJ更能告诉你测试为什么失败

Atrium 是一款开源的 Kotlin 多平台断言库,同时支持 JVM、JS 和 Android。与常见的断言工具不同,它的设计目标只有一个:当测试失败时,用尽可能详细、可读的方式告诉你"哪里错了、为什么错"。本指南面向刚接触 Kotlin 测试的新手,带你快速理解 Atrium 的核心能力,以及它相比 AssertJ 在失败报告上的独特优势。 ## 🤔 断言测试的痛点:为什么失败? 传统

gitblog_01083的博客 750
上一篇: 上岸了!感谢一路帮助我的人
下一篇: 《Kotlin入门实战》CH3 | 类型系统与可空类型
KriyWu
博客等级 码龄9年 3粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值