Kotlin如何成为我们Android开发的主要语言

UE4-(蓝图)第五十五课图片九宫格拉伸的使用 一、为什么使用九宫格拉伸 在UI布局的时候,有时候使用的图片与我们要制作的UI大小有差距,如果图片是普通方式直接拉伸很可能造成图片四个角上的效果与原图片差距太大甚至是变形,这时候使用九宫格模式拉伸,可以保持图片四个角上的样式不发生改变,只对中间区域拉伸。 原始 正常拉伸: 九宫格拉伸: 二、图片参数设置 1.新建一个UI 控件蓝图,在CanvasPanel下拖入一个Image,选择一张... 阅读详情

转载至:Kotlin如何成为我们Android开发的主要语言

引言

Kotlin是一个基于JVM的新的编程语言,由JetBrains开发。JetBrains,作为目前广受欢迎的Java IDE IntelliJ的提供商,在Apache许可下已经开源其Kotlin编程语言。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。它与Java高度可互操作,可以同时用在一个项目中。

Kotlin的定位非常有特点,它并不像Scala那样另起炉灶,Scala是一切尽量自己来,将类库,尤其是集合类都自己来了一遍。实在不够用了再用java的;而Kotlin是对现有Java的增强,尽量用Java的,不够用了再扩展,尤其体现在二者的容器库上,但同时始终保持对java的兼容。这种特点导致Kotlin的学习曲线极低。这是Kotlin官网首页重点强调的:“100% interoperable with Java™”。这意味着什么呢?或者换个问法:我什么时候可以开始在我的项目中引入Kotlin呢?我的回答是:现在就可以视你对kotlin的掌握程度,逐步引入kotlin的代码。

Dima Kovalenko在博客中分享了他们团队使用Kotlin开发商业应用程序的心得和经验,并提供了一些参考资料。希望本文能对广大Android开发程序员有所启发。

几个月前,我们的团队决定开始新的尝试:完全应用Kotlin编程语言开发一个商业应用程序,这是JetBrains公司设计并开源的一种新编程语言。以前,我们有过Kotlin的经验,但那只是小规模应用:将应用程序的一部分转换到一种新的语言,或者应用在花里胡哨的项目。然而,用新的编程语言来开发商业应用程序,我们遇到了一些困难:

  • 我们深深扎根于基于Java的Android开发。切换到Kotlin相当困难,对于以前没有函数式编程经验的人员而言,尤为困难。

  • 有些东西只是不工作。 Dagger也没有立即很好的使用。

所有这些问题,都可能会导致项目无法按期交付、并带来应用程序的稳定性问题。

一个人应该有强烈的转型动力。我们的激励是:相信Kotlin将是Android平台开发的颠覆者——并且这是对我们有挑战的趣事。

让我们打开Kotlin的参考书,开始开发Voter应用程序。Kotlin是一种与Java具有100%互操作性的JVM语言,如果您熟悉Java,那么学习Kotlin就会很容易。然而,如果想充分利用这个编程语言,理解函数式编程概念是至关重要的。

学习函数式编程需要一段时间。所以要有耐心。

至少在学习之初,函数式编程并不容易。我强烈建议使用Martin Ordersky的“Scala中的函数式编程”的课程来学习。Scala有时势不可挡,但它提供了一个极好的函数式编程思维的概述。你可以把Kotlin看成Scala的一个更简化的版本。

为什么我们转向Kotlin阵营

函数式编程风格

Kotlin与Java是100%可互操作的。此外,Kotlin是一种函数式语言。后者允许将表达性的代码编写得更优雅。

纯函数

纯函数(没有副作用的函数)是最重要的函数概念,它允许我们大大降低代码复杂性并消除大多数可变状态。

在JavaScript、Java和C#这些命令式编程语言中,副作用无处不在。这使得调试非常困难,因为变量可以在程序中的任何位置更改。所以当出现一个错误时,由于变量可以在错误的时间更改为错误的值,那么你到哪里去寻找错误呢?到处寻找错误吗?这可不好玩啊!

请注意我们是如何操作数据而不更改其内容的。

fun flatTree(tree: TreeNode): List<TreeNode> 
= listOf(tree, *tree.children.flatMap(::flatTree).toTypedArray())

高阶函数

高阶函数将函数用作参数,返回函数或将函数作为返回值的函数。

高阶函数无处不在。你只需将函数传递给集合,就能使代码更容易阅读。比如, titles.map {it.toUpperCase()}读取简单的英语,是不是很棒?

让我们设想一种情况,假设要计算不同类型的未读消息的数量。典型的方法是:

  private fun getUnreadCountFromUsers() {
    val conversations = datasource.getConversations()
    var count = 0
    for (conversation in conversations) {
      if (conversation.recipientId != null) {
        for (message in conversation.messages) {
          if (message.unread) {
            count += 1
          }
        }
      }
    }
  }

  private fun getNumberOfUnreadAttachmentsInGroupConversations() {
    val conversations = datasource.getConversations()
    var count = 0
    for (conversation in conversations) {
      if (conversation.groupId != null) {
        for (message in conversation.messages) {
          if (message.unread && message.type == MessageType.ATTACHMENT) {
            count += 1
          }
        }
      }
    }
}

正如你所看到的,当引入新的需求时,代码变得难以理解、不可收拾。让我们看看如何使用高阶函数来解决这个问题:

private fun getNumberOfAttachmentsInGroupConvesationsFun() {
    return getCount({conv -> conv.groupId != null}, {it -> it.type == MessageType.ATTACHMENT && it.unread})
  }

  private fun getUnreadCountFromUsersFun() {
    return getCount({conv -> conv.recipientId != null}, {message -> message.unread})
  }

  private fun getTotalNumberOfMessages() = getCount({true}, {true})

  private fun getCount(convFilter: (Conversation) -> Boolean, messageFilter: (Message) -> Boolean) {
    datasource.getConversations()
        .filter(convFilter)
        .flatMap { it.messages }
        .filter(messageFilter)
        .fold(0, { count, message -> count + 1})
}

我们还可以想象一下用例,假设想将fold函数变量参数化。比方说,计算未读消息的乘积。

使用高阶函数的另一个例子是用简单的高阶函数代替多个监听器:

BillingView : LinearLayout {
  var billingChangeListener: (() -> Unit)? = null
  ...
}
... // in an activity far, far away
billingView.billingChangeListener { updateUI() }

不变性

不变性使得代码更容易编写,使用和推理代码(类不变性一次建立,然后不变——一劳永逸)。应用程序组件的内部状态将更加一致。Kotlin通过引入val关键字以及Kotlin集合来强制不变性,Kotlin集合在默认情况下是不可变的。 一旦val或者一个集合被初始化,你就可以确定它的有效性。(有关val关键字的更精确的定义,请参阅文末的更新)。

data class Address(val line1: String, val city: String)
val items = listOf(Address("242 5th St", "Los Angeles"),   Address("Dovzhenka St. 5", "Kiev"))

Null-safety

这个语言特性使我们仔细考虑了模型类中字段的可空性。以前,当不确定DTO中的字段是否已初始化时,@Nullable和@NotNull的注释就能提供帮助,但也很有限。现在,使用Kotlin,就能让你准确知道什么字段可以为null,什么字段被初始化(例如,Dagger注入的字段),并且你可以对这些字段有严格的控制。结果?几乎没有NullPointerExceptions。(在内部我们管?.叫做“鹅”操作符,因为它看起来像一个鹅的脖子。)

brand?.let { badge.enabled = brand.isNewBadge }
// Can also be written as
badge.enabled = brand?.isNewBadge?:false

Anko

Anko DSL是一个很了不起的的库,它大大简化了工作视图、线程和Android生命周期。据Github的描述,Anko是“令人愉快的Android应用程序开发”,事实证明,的确如此。

selector(items = listOf("Like", "Dislike") {
    when (it) {
      0 -> if (!liked) likePost()
      else -> if (!disLiked) disLikePost()
    }
}

doAsync {
    // Long background task
    uiThread {
      alert(R.string.could_not_log_in) {
        yesButton { dismiss() }
        cancellable = false
      }.show()
    }
}

注意,当uiThread在Activity内调用时,如果isFinishing为true,块将不会执行。我们实际上不使用这个功能,因为RxJava会处理应用程序中的所有线程,但它是一个很好的功能。

使用Anko而不是XML。虽然Anko还没有做好准备取代标准的Android UI构建,但有的时候,它非常方便。

verticalLayout() {

  friendsPanel = friendsPanel.with(friendsData).lparams(width = matchParent)

  politicalMapCardView {
    setMarker(quizManager.getMarker())
  }.lparams(width = matchParent) { topMargin = dip(10) }

  cardView() {
    verticalLayout() {
      topPadding = dip(5)
      textView(getString(R.string.register_question))
      blueButtonView(text="Register here") {
        onClick { browse("https://www.uptech.team") }
      }
    }
  }.lparams(width = matchParent) {
    topMargin = dip(10)
    bottomMargin = dip(20)
  }
}

如您所见,Anko DSL允许您在Android内置视图中使用自定义视图。这一点与标准XML相比有很大的优势。

Kotlin Android扩展:删除ButterKnife依赖

@Bind(R.id.first_name)
protected EditText firstName;

@Bind(R.id.last_name)
protected EditText lastName;

@Bind(R.id.address_line1)
protected EditText addressLine1;

@Bind(R.id.address_line2)
protected EditText addressLine2;

@Bind(R.id.zip_code)
protected EditText zipCode;

@Bind(R.id.state)
protected TextView state;

@Bind(R.id.state_spinner)
protected HintSpinner stateSpinner;

@Bind(R.id.city)
protected EditText city;

@Bind(R.id.frag_shipping_address_save_btn)
protected Button saveBtn;

@Bind(R.id.agreement)
protected TextView agreement;

@Bind(R.id.email)
protected EditText email;

@Bind(R.id.password)
protected EditText password;

@Bind(R.id.create_account_container)
protected LinearLayout accountContainer;

@Bind(R.id.member_container)
protected LinearLayout memberContainer;

@Bind(R.id.logged_in_title)
protected TextView loggedInTitle;

@Bind(R.id.user_email)
protected TextView userEmail;

@Bind(R.id.sign_out)
protected TextView signOut;

@Bind(R.id.scrollview)
protected ScrollView scrollView;

@Bind(R.id.dummy)
protected EditText dummyView;

上面那段代码读起来无聊吗?我敢打赌你一直滚动而没有阅读。在Kotlin,你并不需要任何这些东西。您可以通过其@id XML参数引用视图属性,这些属性将与XML文件中声明的名称相同。更多信息可以在官方文档中找到。

其他整洁的功能

1. 扩展功能和构建器

items = StoreInfo().apply { storeItems = fetchItems() }.let { manager.process(it) }
container.apply {
removeAllViews()
items.forEach { addView(ShopItemView(context).withData(it)) }
}

fun ShopItemView.withData(item: StoreItem): ShopItemView {
title = item.title
image = item.image
Brand.findById(item.id)?.let { brandName = it.name }
}
apply、let和扩展功能可以轻松地用于创建简洁的构建器。

2. 为初学者快速破解

在最初的前几天,你经常被一个问题难倒:你不知道如何在Kotlin中写一个相当简单的Java表达式。这里有一个简单的诀窍,就是是在Java中编写一段代码,然后将其粘贴到Kotlin文件中。感谢JetBrains的工程师们,它会自动转换为Kotlin。

黑客的工作方式就像一个魔术!

3. 摆脱不必要的依赖

Kotlin替换了许多第三方库,如ButterKnife、Google Autovalue、Retrolambda、Lombok和一些RxJava代码。

总结

作为一个软件开发团队,我们面临的主要挑战是提供优秀的产品,并有效地完成工作。虽说开始用Kotlin有效的开发软件,需要你有函数式编程的背景,但是,投入精力去学习是值得的,能给你巨大的回报。我相信,Kotlin是常规Android开发的一个重大改进,能让我们及时提供错误更少的、更加优秀的应用程序。

更新:val实际上并不意味着“不可变的”,而是“只读”。有关详细信息,请参阅下面的参考文章。

参考文献

《Kotlin 参考手册》

《所以,你要成为一名函数式程序员》

《为什么函数式编程很重要》

《Java使用不可变对象编程的6大好处》

《Anko DSL对Android XML-First》

《将应用转换为纯Kotlin的经验教训》

《结果:应用程序投票选举:99.8%无故障用户》

《Kotlin:val不意味着不可变,而意味着只读》

Anaconda数据报错:Fatal error in launcher: Unable to create process using ‘“E:\Anaconda\python.exe“ “D:\ 里面的pip.exe程序出现了问题,我这里直接删除,重新安装解决,上面已经手动删除pip.exe删除pip.exe,重新安装pip.exe用下面命令: 测试是否成功成功解决 阅读详情

相关推荐

无法获得下列放可solidworks standard 无法连接到服务器-15,10,10061如何解决?

无法获得下列放可solidworks standard 无法连接到服务器-15,10,10061如何解决?

qq_63539957的博客 2万+

Kotlin DSL

Kotlin DSL DSL 总体来说是非常简洁的,在使用 Android 开发 java 的过程中,貌似么有使用过 DSL之类的写法,而在 kotlin 中,使用最多的 DSL 就是 anko 根据 anko 的官方文档说明,使用 DSL 有以下好处(也就是使用 xml 的坏处): By default, UI in Android is written using XML. That is i...

花不掉泪的博客 3110

【驭风计划 算法训练营】周测4:习题11-4、8-4、12-4

给出 nn 个非负整数 x1,x2,⋯,xnx1,x2,⋯,xn,有 qq 个询问,第 jj 个询问给出一个非负整数 yjyj,求其中,xor 表示按位异或运算。

Mege1的博客 1043

Kotlin入门学习(非常详细),从零基础入门到精通,看完这一篇就够了

和Java中的接口定义类似。

Javachichi的博客 6万+

思博伦Spirent TestCenter创建单播流uni-stream

Traffic Generator列表中会出现刚才创建的uni-stream,创建完成。通常测试情况下,主要对Ethenet II和IPv4 Header进行配置。(通常情况下,如果流配置比较规范,选择任意端口接收,也没问题。编辑uni-stream基本信息。配置本条流由STC哪个端口接收。

辗转反测的博客 1681

LVDS系列11:Xilinx Ultrascale系可编程输入延迟(一)

按照IDELAYCTRL的参考时钟频率可以准确计算获取到,如200M参考时钟抽头分辨率为78ps,Ultrascale系列相对于7系列架构大改,体现便是U/U+系列的抽头增加到512个,同时每个抽头的分辨率就无法像7系列那样能得到一个准确的值,是一个波动的范围值,抽头分辨率随着工艺温度电压的变化而变化。EN_VTC:电压温度补偿开启的使用信号,COUNT模式下不能使用,必须保持为0,TIME模式下需要使用,在延迟工作时要启用温度电压补偿,在修改抽头值时需要关闭温度电压补偿,修改完后启用;

weixin_38828382的博客 1941

Kotlin 6. Kotlin Spinner 在 Activity 以及 Fragment 中的使用

Kotlin Spinner 在 Activity 以及 Fragment 中的使用。

破浪会有时的博客 1467

【物联网】探索NE555:一款经典的集成电路(超详细)

NE555是一种集成电路,其内部结构包括比较器、RS触发器、电压比较器和输出级三个主要功能模块,外部引脚则提供了与其他电路元件进行连接的接口。NE555的设计目的是为了提供一种简单方便的定时器解决方案,它广泛应用于模拟和数字电路中。NE555作为一款经典的集成电路,具备设计简单、易于使用和稳定可靠的特点,在电子领域发展了广泛的应用。从单稳态模式到多稳态模式,再到振荡器模式,NE555可以满足不同的需求,并且可以与其他电路元件灵活组合,扩展其功能。然而,需要注意的是NE555也有一些限制。

Goforyouqp的博客 6万+

kotlin实现简单的spinner

1.效果图: 2.主界面: package com.ufi.pdioms.ztkotlin import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.View import android.widget.Adap...

cf8833的博客 2168

1.1、matlab:基于模板匹配的车牌识别

matlab:基于模板匹配的车牌识别

XU157303764的博客 2915

【Bug已解决】claude: No such file or directory — Claude Code 命令凭空消失解决方案

方案适用场景推荐指数难度方案一:重建软链接所有平台,软链接断裂⭐⭐⭐⭐⭐低方案二:修复 shebangnvm 用户,不想重装⭐⭐⭐⭐中方案三:nvm default aliasnvm 用户,长期稳定⭐⭐⭐⭐低方案四:切换到 Volta频繁切换 Node.js 版本⭐⭐⭐中方案五:修复 PATHPATH 配置丢失⭐⭐⭐⭐低方案六:Homebrew 安装macOS 用户,npm 不稳定⭐⭐⭐⭐低根本原因与。

博客 1万+

Android开发工程师必备:《kotlin从入门到精通》

对于安卓开发者来说,掌握已经成为一项必备技能。自2017年Google I/O大会上Kotlin被宣布为Android开发的官方支持语言以来,越来越多的开发者和项目开始采用Kotlin进行Android应用开发。

m0_56144365的博客 1134

华为od 面试八股文_Spring_03_含答案

控制反转IOC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:依赖注入和依赖查找依赖注入;

MISAYAONE的博客 2341

Kotlin学习——了解Kotlin

零基础入门Kotlin

一个初中生的博客 626

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Google称内部全在用Kotlin搞安卓开发,体验碾压Java

????????关注后回复“进群”,拉你进程序员交流群????????出品| OSC开源社区(ID:oschina2013)在 KotlinConf 2023 开幕主题演讲中, Grace Kloba 分享了来自 Google 的最新消息:Google 内部几乎全在用 Kotlin 搞 Android 开发。Kotlin 在 2016 年左右开始在 Android 社区中流行起来。2017 年,谷歌宣布在 Andr...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 462

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

浅析Kotlin——新Android官方语言

写在前面: 在不久前Google io开发者大会上面,Google突然发出大招–Kotlin成为Android开发的官方语言。一夜间,大多数全球的Android开发者们一脸懵逼,绝大多数人之前压根不知道Kotlin是个什么东西。而这就意味着,在之后的Android项目开发中将逐步从Java语言转变为Kotlin语言,而在以后新增的代码文件将不再以Java代码的形式出现,而是以 Kotlin 代码...

fjnu_se的博客 2922

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android Kotlin学习之路

2017年的Google I/O中,Google 宣布 Kotlin 成为 Android 官方开发语言。学习Kotlin,大势所趋。 1.学习参考 推荐学习的网站: Kotlin官网:http://kotlinlang.org/ Kotlin中文网:https://www.kotlincn.net/ Kotlin教程-菜鸟驿站:https://www.runoob.com/ko...

Yu_yan_ran的博客 416

Kotlin成为正式的Android编程语言

在Google I/O 2017大会上,Google正式宣布Android Studio 3.0完全支持Kotlin,Kotlin也将从JetBrain移交给独立的非盈利组织来进行后续的开发。\\Google正式将Kotlin加入到Android的开发语言行列,其他为数不多的语言还包括Java和C++。关于为什么选择Kotlin,Google说“Kotlin简洁、表现力强,而且具有类型安全和空值安...

weixin_33849942的博客 69

Kotlin语言的游戏开发

Kotlin是一种现代化的静态类型编程语言,由JetBrains在2011年首次发布。它被设计为一种可与Java完全互操作的语言,Java虚拟机(JVM)是其主要运行环境。在2017年,Google正式宣布Kotlin为Android官方支持语言,这一决定使Kotlin的使用者数量迅速增长。Kotlin的设计理念强调简洁、安全和表达力。例如,Kotlin通过类型推断减少了冗余代码,从而提高了开发效率。此外,Kotlin的空安全特性有效地减少了空指针异常的发生,提升了代码的安全性。

2501_90435715的博客 516

弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言

自从 2011 年发布以来,Kotlin 凭借强大的功能在开发者中的欢迎程度与日俱增。且在一年前,Google 宣布 Kotlin 正式成为 Android 官方开发语言,由此引发了从 Java 迁移到 Kotlin 的一股热潮,根据 StackOverflow 上超过 10 万名受访者的调查显示,Kotlin 成为第二大受欢迎的语言,第一名是 Mozilla 开发的系统编程语言 Rus...

a7715365的博客 182

C 语言或 Kotlin 有望成为年度语言,编程语言 12 月排行榜

(点击上方蓝字,快速关注我们)技术最前线(TopITnews)整理【导读】:TIOBE 最近公布了 2017 年 12 月编程语言指数排行榜,排名前三的还是 Java、C...

redditnote的博客 201

什么是Kotlin?Kotlin语言的前景怎么样?

​ Kotlin是由JetBrains公司开发的,用于多平台应用的静态编程语言。2017年谷歌I/O大会上Android 团队宣布Kotlin成为其官方头等支持语言。它可以被编译成Java字节码,100%兼容Java语言,也可以被编译成JavaScript

zy1992As的博客 3364

2020年是做安卓开发人员的绝佳时机源码+原理+手写框架

前言 2020年是转折的一年,上半年疫情原因,很多学android开发的小伙伴失业了,虽找到了一份工作,但高不成低不就,下半年金九银十有想法更换一份工作,很多需要大厂面试经验和大厂面试真题的小伙伴,想提前准备刷下题。接下来分享一份我的字节跳动、阿里巴巴、百度、小米等大厂面试经验和总结。(文末附真题解析大全) 阿里(被拒) 字节跳动(offer) 小米(offer) 手百 (offer) 在今日凌晨的 Google I/O 大会上,Google 官方正式宣布,Kotlin 编程语言现在是 Andro.

qq_38514574的博客 182

Kotlin学习笔记(一)---从零学习Kotlin

关于KotlinAndroid开发目前火到不行的语言,17年IO大会推出Android官方开发语言,相信每个人都或多或少有了解,关于Kotlin的起源以及作用,不用再阐述,已经有有心人整理好了 Kotlin官网中Android部分 Kotlin中文网站 Android遇上Kotlin | 第一部分第一课 : Kotlin若只如初见 Kotlin 资源大全 - 学 Kotlin 看这一篇教程就够了 有

dai的博客 1635
上一篇: Kotlin-泛型
下一篇: Android5.0常用颜色属性说明
行云间
博客等级 码龄12年 438粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值