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

学会网站 建设seo手机关键词网址

学会网站 建设,seo手机关键词网址,杭州煜灿网络科技有限公司网站开发,模板建站源码文章目录 kotlin筑基一. Kotlin最基础语法1.1 变量1.2 函数 二. Kotlin与Java完全兼容#xff0c;就可以随便调用了吗#xff1f;2.1 语法变化2.2 kotlin关键字处理 三. 新手使用Kotlin常碰到的问题3.1 Kotlin 没有封装类3.2 Kotlin 类型空值敏感3.3 Kotlin 没有静态变量与静… 文章目录 kotlin筑基一. Kotlin最基础语法1.1 变量1.2 函数 二. Kotlin与Java完全兼容就可以随便调用了吗2.1 语法变化2.2 kotlin关键字处理 三. 新手使用Kotlin常碰到的问题3.1 Kotlin 没有封装类3.2 Kotlin 类型空值敏感3.3 Kotlin 没有静态变量与静态方法 四. 函数也能嵌套这个特性要注意4.1 函数的特性语法4.2 嵌套函数4.3 扩展函数4.4 DSL的基础Lambda闭包的语法4.5 高阶函数4.6 内联函数 五. 类与对象1. 构造函数2. 访问修饰符3. 伴生对象4. 单例类5. 动态代理6. Kotlin 特有的类 六. 高级特性1. 解构2. 循环与集合操作符3. 集合操作符4. 作用域函数5. 中缀表达式运算符重载6. DSL 七. Kotlin的扩展库1. kotlinx.coroutines2. kotlinx-io2. kotlinx-io3. Android KTX kotlin筑基 一. Kotlin最基础语法 1.1 变量 var表示可变变量val表示不可变变量注意并不是常量。变量名写在前面类型写在后面编译器如果能推断出你的类型那么类型是不用声明的 。 var age:Int 18 val name :String zhangsan编译器自动推断类型。 var age 18 val name zhangsan空安全类型编译器报错 val name2: String null如果还是想给赋初始化值的话 val name2: String? null注意String和String是两个完全不同的类型。不能互相赋值的。 如果还是想强行通过编译呢加上两个感叹号!!表示强行的意思当你确定name2不为null那么就可以强行赋值给name var age: Int 18 var name: String zhangsan var name2: String? null fun main() {name name2!! }但是我们反过来name赋值给name2可以吗 可以的,name确定不为空name2包含可空和不可空所以可以赋值 var age: Int 18 var name: String zhangsan var name2: String? null fun main() {name name2!!name2 name }1.2 函数 fun声明函数printLen函数名str: String参数和参数类型: String 返回值12312123 s t r 模板字符串 str模板字符串 str模板字符串符号可以引用一个变量将这个变量组合成新的字符串。 fun printLen(str: String): String {println(12312123 $str)return str }测试一下 var age: Int 18 var name: String zhangsan var name2: String? null fun main() { // name name2!! // name2 nameprintLen(1231231) }fun printLen(str: String): String {println(adads $str)return str }二. Kotlin与Java完全兼容就可以随便调用了吗 2.1 语法变化 Java 与 Kotlin 交互语法变化 kotlin是可以写在文件中而不一定在类中 //Utils.kt fun echo(name: String) {println($name) }java是要写在类中在java中调用kotlin文件中的代码UtilsK后缀要加Ktkotlin文件中都会被编译为public static变量所以在java的main函数中可以直接文件名.函数名调用。 // Main.java public static void main(String[] args) {UtilsKt.echo(hello); }kotlin的特殊语法object开头后面跟一个类的声明 object Test {fun sayMessage(msg: String) {println(msg)} }调用: kotlin code Test.sayMessage(hello)java code Test.INSTANCE.sayMessage(hello);接下来我们康康类的class两种语言的区别 java code TestMain.classkotlin code TestMain::class.java在kotlin中调用java类的class,JavaMain由于这个类是java类所以JavaMain::class.java后缀需要加上.java java code public class JavaMain {}kotlin code fun testClass(clazz: ClassJavaMain) {println(clazz.simpleName) } fun main() {testClass(JavaMain::class.java) }下面演示调用kotlin的class如果是kotlin类的class需要KClass这样声明KotlinMain::class调用的时候直接调用后缀不用加上.java因为是kotlin类的class。 kotlin code class KotlinMain { }import kotlin.reflect.KClassfun testClass(clazz: ClassJavaMain) {println(clazz.simpleName) }fun testClass(clazz: KClassKotlinMain) {println(clazz.simpleName) }fun main() {testClass(JavaMain::class.java)testClass(KotlinMain::class) }2.2 kotlin关键字处理 比方说在java中有个变量变量名叫in public class JavaMain {public static String in in; }在kotlin中 in是一个关键字在kotlin中调用java这个变量就不能直接调用了,需要加上单引号 fun main() {println(JavaMain.in) }三. 新手使用Kotlin常碰到的问题 3.1 Kotlin 没有封装类 看看demo java code public class A implements AInterface {public static final A a new A();Overridepublic void putNumber(int num) {System.out.println(int);}Overridepublic void putNumber(Integer num) {System.out.println(Integer);} } public interface AInterface {void putNumber(int num);void putNumber(Integer num); }kotlin code fun main() {A.a.putNumber(123) }输出int 我们发现输出是int而不是Interge也就是说kotlin运行的时候调用的是基本数据参数的那个方法而不会去执行有封装类的那个重载方法。 3.2 Kotlin 类型空值敏感 java code public class A {public static String format(String string) {return string.isEmpty() ? null : string;} }在kotlin中调用format方法 fun main() {val format A.format(123)val format1: String A.format(123)val format2: String A.format(123) }三种返回类型 第一种类型自动推断带有感叹号的String只有在java和kotlin互调才会有不能手动声明由编译器认为这是个java的类型但是放到了kotlin代码中去使用所以带有感叹号 第二,三种类型是手动声明的。 3.3 Kotlin 没有静态变量与静态方法 我们加上JvmStatic注解之后在Java中就可以像kotlin一样调用这个方法了 这个方法在代码编译之后也会被编译为public static的方法。 object Test {JvmStaticfun sayMessage(msg: String) {println(msg)} }java code Test.sayMessage(hello)而不需要这样 Test.INSTANCE.sayMessage(hello);四. 函数也能嵌套这个特性要注意 4.1 函数的特性语法 函数举例 fun echo(name: String) {println($name) } fun echo(name: String zhangtao) {println($name) } fun echo(name: String) println($name)参数可以有默认值, fun echo(name: String zhangtao) {println($name) }测试,不传参数直接取默认值 fun main() {echo() }优点可以大大减少重载函数的数量。 函数体只有一条语句是可以直接赋值给这个函数的。 fun echo(name: String) println($name)4.2 嵌套函数 用途: 在某些条件下触发递归的函数不希望被外部函数访问到的函数,内部函数可以访问外部函数的局部变量。 fun function() {var str helle worldfun say(count: Int 10) {println(str)if (count 0) {say(count - 1)}}say() }测试 fun main() {function() }4.3 扩展函数 File是类名readText扩展的方法名 fun File.readText(charset: Charset Charsets.UTF_8):String readBytes().toString(charset)test,跟我们正常调用方法一样。 fun main() {val file File(test.txt)println(file.readText()) }在java中怎么使用我们的扩展函数。 java code public class A {public static void main(String[] args) {File file new File(test.txt);String s FilesKt.readText(file, Charsets.UTF_8);System.out.println(s);} }扩展函数的静态解析: demo: 不具备多态的运行类型 open class Animal class Dog : Animal()fun Animal.name() animal fun Dog.name() dogfun Animal.printfName(animal: Animal) {println(animal.name()) } fun main() {Dog().printfName(Dog()) } 输出 反编译看看这段代码 annimal的扩展函数name() fun Animal.name() animal //对应下面的反编译代码 NotNullpublic static final String name(NotNull Animal $this$name) {Intrinsics.checkNotNullParameter($this$name, $this$name);return animal;}dog的扩展函数name() fun Dog.name() dog //对应下面的反编译代码NotNullpublic static final String name(NotNull Dog $this$name) {Intrinsics.checkNotNullParameter($this$name, $this$name);return dog;}Animal的扩展函数printfName fun Animal.printfName(animal: Animal) {println(animal.name())}//对应下面的反编译代码//NotNull Animal $this$printfName 这个参数指的是扩展这个函数的那个对象public static final void printfName(NotNull Animal $this$printfName, NotNull Animal animal) {Intrinsics.checkNotNullParameter($this$printfName, $this$printfName);Intrinsics.checkNotNullParameter(animal, animal);String var2 name(animal);System.out.println(var2);}public static final void main() {printfName((Animal)(new Dog()), (Animal)(new Dog()));} main函数反编译后(Animal)(new Dog()), (Animal)(new Dog())我们传入的Dog对象实际上被强转为Animal的所以最终输出annimal的扩展方法name(). 4.4 DSL的基础Lambda闭包的语法 java code 常规写法 public class A {public static void main(String[] args) {Thread thread new Thread(new Runnable() {Overridepublic void run() {}});thread.start();} }Lambda写法Runnable对象省略为一对括号加箭头 public class A {public static void main(String[] args) {Thread thread new Thread(() - {});thread.start();} }kotlin code fun main() {val thread Thread({ - Unit })thread.start() }如果Lambda没有参数可以省略箭头符号 fun main() {val thread Thread({})thread.start() }如果Lambda是函数的最后一个参数可以将大括号放在小括号外面 fun main() {val thread Thread(){}thread.start() }如果函数只有一个参数且这个参数是Lambda则可以省略小括号 fun main() {val thread Thread {}thread.start() }Lambda 闭包声明 fun main() {echo.invoke(123)echo(123) } val echo { name: String -println(name) }参数是有上线的最多只能有22参数 fun main() {lambdaA(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) }val lambdaA { a1: Int, a2: Int, a3: Int, a4: Int, a5: Int, a6: Int, a7: Int, a8: Int, a9: Int, a10: Int, a11: Int, a12: Int, a13: Int, a14: Int, a15: Int, a16: Int, a17: Int, a18: Int, a19: Int, a20: Int, a21: Int, a22: Int -println(!23) }输出!23 我们加多一个参数总共23个参数会抛一个异常 Lambda会被编译成一个匿名内部类Function23,有23参数 源码中只有22个参数 解决 手动定义一个Function23. 4.5 高阶函数 kotlin code fun main() {onlyif(true) {println(打印日志)} }fun onlyif(isDebug: Boolean, block: () - Unit) {if (isDebug) block() }重点:函数是“一等公民” fun main() {val runnable Runnable {println(run)}val function: () - Unitfunction runnable::runonlyif(true, function) }fun onlyif(isDebug: Boolean, block: () - Unit) {if (isDebug) block() }输出run 正常执行 4.6 内联函数 用内联优化代码 Kotlin 的 Lambda 是一个匿名对象 可以使用inline 修饰方法这样当方法在编译时就会拆解方法的调用为语句调用进而减少创建不必要的对象 fun main() {val runnable Runnable {println(run)}val function: () - Unitfunction runnable::runonlyif(true, function) }inline fun onlyif(isDebug: Boolean, block: () - Unit) {if (isDebug) block() }加上inline反编译 public static final void onlyif(boolean isDebug, NotNull Function0 block) {int $i$f$onlyif 0;Intrinsics.checkNotNullParameter(block, block);if (isDebug) {block.invoke();}} main函数,语句调用 public static final void main() {Runnable runnable (Runnable)null.INSTANCE;Function0 function null;function (Function0)(new Function0(runnable) {// $FF: synthetic method// $FF: bridge methodpublic Object invoke() {this.invoke();return Unit.INSTANCE;}public final void invoke() {((Runnable)this.receiver).run();}});boolean isDebug$iv true;int $i$f$onlyif false;function.invoke();}没加反编译 public static final void onlyif(boolean isDebug, NotNull Function0 block) {Intrinsics.checkNotNullParameter(block, block);if (isDebug) {block.invoke();}}main函数方法调用 public static final void main() {Runnable runnable (Runnable)null.INSTANCE;Function0 function null;function (Function0)(new Function0(runnable) {// $FF: synthetic method// $FF: bridge methodpublic Object invoke() {this.invoke();return Unit.INSTANCE;}public final void invoke() {((Runnable)this.receiver).run();}});onlyif(true, function);}减少临时对象的生成。inline只会用于修饰高阶函数。 五. 类与对象 1. 构造函数 Kotlin 的类默认是 public final 的,init是在构造函数被调用的时候执行。 open class MainActivity(var int: Int) : AppCompatActivity(), View.OnClickListener {init {println(loge)}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_test)}override fun onClick(v: View?) {} }Kotlin 构造方法,隐藏的主构造函数跟着类名后面次级构造函数间接或直接继承主构造函数或者父类的构造函数。 class MyView : View {constructor(context: Context?) : super(context)constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context,attrs,defStyleAttr) }2. 访问修饰符 private protected public internal同一个模块内可以互相调用。 3. 伴生对象 kotlin code class StringUtils {companion object {fun ifEmpty(str: String): Boolean {return str}} } kotlin code调用 fun main() {StringUtils.ifEmpty(123) }java code 调用 public class A {public static void main(String[] args) {StringUtils.Companion.ifEmpty(213123)} }4. 单例类 class Single private constructor() {companion object {fun get(): Single {return Holder.instance}}private object Holder {val instance Single()} }fun main() {Single.get() }5. 动态代理 类的动态代理 fun main() {Zoo(Dog()).back() }interface Animal {fun back() }class Dog : Animal {override fun back() {println(12312)} }class Zoo(animal: Animal) : Animal by animal输出 12312 假设我们Zoo中 class Zoo(animal: Animal) : Animal by animal{override fun back() {println(Zoo)} }输出Zoo 6. Kotlin 特有的类 数据类 public final getter()/setter() toString()hashCode()equals()copy() data class User(var id: Int, var name: String)枚举类 密闭类 sealed class TestOne {object A : TestOne()object B : TestOne()object C : TestOne()object D : TestOne() }六. 高级特性 1. 解构 operator:将一个函数标记为重载一个操作符或者实现一个约定 class User(var age: Int, var name: String) {operator fun component1() ageoperator fun component2() name }fun main() {val user User(12, name)val (age, name) userprintln(age)println(name) }常用在遍历map fun main() {val map mapOfString, String(key to key, value to value)for ((k, v) in map) {println($k, $v)} }2. 循环与集合操作符 五种常用循环 fun main() {for (i in 1..10) {println(i)}for (i in 1 until 10) {println(i)}for (i in 10 downTo 1) {println(i)}for (i in 1..10 step 2) {println(i)}repeat(10) {println(it)}}遍历集合,解构 fun main() {val list arrayListOfString(a, b, c)for (str in list) {println(str)}for ((index, str) in list.withIndex()) {println($index $str)}}3. 集合操作符 集合操作符 fun main() {val arrayListOf arrayListOfChar(a, b, c, d)val a arrayListOf.map { it - a }.filter { it 0 }.find { it 1 } }4. 作用域函数 五个常用函数 run{},with(T){},let{},apply{},also{}. import javax.jws.soap.SOAPBinding.Usedata class User(var name: String)fun main() {val user User(1231)//let与run都会返回闭包的执行结果区别在于let有闭包参数而run没有闭包参数val let user.let { user: User - let::${user.javaClass} }println(let)val run user.run { run::${this.javaClass} }println(run)//also与apply都不返回闭包的执行结果区别在于aso有闭包参数而apply没有闭包参数user.also { println(also::${it.javaClass}) }user.apply { println(apply::${this.javaClass}) }//takeIf 的闭包返回一个判断结果为false时takeIf函数会返回空// takeUnless 与 takeIf 刚好相反 闭包的判断结果为true时函数会返回空user.takeIf { it.name.length 0 }?.also { println(姓名为${it.name}) } ?: println(姓名为空)user.takeUnless { it.name.length 0 }?.also { println(姓名为空) } ?: println(姓名${user.name})//重复执行当前闭包repeat(5) {println(user.name)println(it)}//with比较特殊//不是以扩展方法的形式存在的而是一个顶级函数with(user) {this.name with} }5. 中缀表达式运算符重载 一个函数只有用于两个角色类似的对象时才将其声明为中缀函数推荐示例:and、 to、zip。反例: add。 如果一个方法会改动其接收者那么不要声明为中缀形式。 6. DSL 七. Kotlin的扩展库 1. kotlinx.coroutines 协程是什么 通过提升 CPU 利用率减少线程切换进而提升程序运行效率 可控制:协程能做到可被控制的发起子任务 轻量级:协程非常小占用资源比线程还少 语法糖:使多任务或多线程切换不再使用回调语法 启动协程 runBlocking :T//用于执行协程任务 通常只用于启动最外层协程 launch : Job//用于执行协程任务 async/await : Deferred//用于执行协程任务 package com.chk.myexpandlistimport kotlinx.coroutines.async import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main() {runBlockingUnit {val launch launch {repeat(1000) { i -println(挂起中 $i。。。)delay(500L)}}var job2 async {delay(500L)returnasync hello}println(job2.await())delay(1300L)println(main:主线程等待中)launch.cancel()launch.join()println(main:即将完成退出)} }三种启动方式launch的源码中共四个参数 public fun CoroutineScope.launch(context: CoroutineContext EmptyCoroutineContext,start: CoroutineStart CoroutineStart.DEFAULT,block: suspend CoroutineScope.() - Unit )context当前程序上下文协程与协程切换传递参数CoroutineContext调度器可放到某个线程中 start以哪种方式启动协程 block启动的协程 demo private val okHttpClient OkHttpClient() private val request Request.Builder().url(https//baidu.com).get().build() fun displayDashboard(textView: TextView) runBlocking {withContext(Dispatchers.Main) {textView.text withContext(Dispatchers.Default) {okHttpClient.newCall(request).execute().body()?.string()}} }java code public class Dashboard {private final OkHttpClient okHttpClient new OkHttpClient();private final Request request new Request.Builder().url(https://baidu.com).get().build();private final Handler handler new Handler(Looper.getMainLooper());public void display(final TextView textView) {okHttpClient.newCall(request).enqueue(new Callback() {Overridepublic void onFailure(Call call, IOException e) {}Overridepublic void onResponse(Call call, Response response) throws IOException {final String string response.body().string();handler.post(() - textView.setText(string));}});} }test class TestMainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_test_main)}fun test2(view: View) {val tvContent findViewByIdTextView(R.id.mContent)Dashboard().display(tvContent)displayDashboard(tvContent)}fun test1(view: View) {runBlocking {withContext(Dispatchers.Main) {println(在主线程中启动一个协程 Thread.currentThread().name)}}} }xml ?xml version1.0 encodingutf-8? ScrollView xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:orientationverticalTextViewandroid:texthello worldandroid:idid/mContentandroid:layout_widthwrap_contentandroid:layout_heightwrap_content /Buttonandroid:idid/btnTestThreadandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:onClicktest1android:text测试1 /Buttonandroid:text测试2android:onClicktest2android:idid/btnTestCoroutineandroid:layout_widthwrap_contentandroid:layout_heightwrap_content //LinearLayout /ScrollViewobject AndroidCommonPool : CoroutineDispatcher() {override fun dispatch(context: CoroutineContext, block: Runnable) {AsyncTask.THREAD_POOL_EXECUTOR.execute(block)} }suspend关键字 / / suspend被suspend修饰的函数只能被有suspend 修饰的函数调用 //因为suspend修饰的函数(或lambda)被编译后会多一个参数类型叫Continuation, //协程的异步调用本质上就是一次回调 suspend fun getHtml(): String {return withContext(AndroidCommonPool) {URL(http://baidu.com).readText()} }在java中调用getHtml public class JavaActivity extends AppCompatActivity {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);LaunchCoroutineKt.getHtml(new ContinuationString() {NonNullOverridepublic CoroutineContext getContext() {return null;}Overridepublic void resumeWith(NonNull Object o) {}});} }特殊的启动协程方式 buildSequence/yield: Sequence buildlterator: lterator produce : Channel 2. kotlinx-io kotlin object AndroidCommonPool : CoroutineDispatcher() {override fun dispatch(context: CoroutineContext, block: Runnable) {AsyncTask.THREAD_POOL_EXECUTOR.execute(block)} }suspend关键字 / / suspend被suspend修饰的函数只能被有suspend 修饰的函数调用 //因为suspend修饰的函数(或lambda)被编译后会多一个参数类型叫Continuation, //协程的异步调用本质上就是一次回调 suspend fun getHtml(): String {return withContext(AndroidCommonPool) {URL(http://baidu.com).readText()} }在java中调用getHtml public class JavaActivity extends AppCompatActivity {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);LaunchCoroutineKt.getHtml(new ContinuationString() {NonNullOverridepublic CoroutineContext getContext() {return null;}Overridepublic void resumeWith(NonNull Object o) {}});} }特殊的启动协程方式 buildSequence/yield: Sequence buildlterator: lterator produce : Channel 2. kotlinx-io 3. Android KTX
http://www.hkea.cn/news/14366365/

相关文章:

  • 山西太原制作网站人有吗软件开发周期包括哪几个阶段
  • 网站首页设计收费小说网站怎么做推广
  • 企业网站模板免费下载企业网站模板wordpress代码添加文章字段栏目
  • 网站用不用备案谁的网站模板利于优化
  • wap网站排名shopify网站建设
  • 如何开wordpress网站网络营销网站建设存在问题
  • 北京网站营销seo方案怎么为一个网站做外链
  • 网站改版意义广州大型网站制作公司
  • 重庆网站制作设计公司班级优化大师网页版
  • 温州免费做网站平面设计师招聘信息
  • 网站建设设计报告前言青岛网站开发招聘
  • 做网站图片切图可以用中文吗策划案怎么做
  • 外国做图网站广点通广告投放平台
  • 格尔木市建设局网站门户网站具有什么特点
  • 济南网站制作哪家最好免费个人网站注册方法
  • 什么是一学一做视频网站安徽省建设工程信息网公共服务平台
  • 西安网站定制星裕建设网站
  • 网站备案时间就是正式上线时间吗龙岩网站设计较好的公司
  • 仿做网站的网站桂林市卫生学校
  • 网站建设08国内免费建站平台
  • 中国空间站图片wordpress 显示所有分类
  • 谁能给做网站成都代做网站
  • 常用的做网站的工具都有哪些浙江天力建设集团有限公司网站
  • 特网站建设做文案的网站
  • 辽阳企业网站建设团队网页微信支付
  • 彩票网站建设平台个人网站开发 怎么赚钱
  • 做毕设最常去的几个网站外贸 网站 seo
  • 网站建设公司广告wordpress新闻模板
  • 妇女之家网站建设方案开发公司租赁机械车位价格
  • 韶关做网站公司wordpress的文章调用