<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>语法 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E8%AF%AD%E6%B3%95/</link><description>Recent content in 语法 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 29 Nov 2017 11:04:06 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E8%AF%AD%E6%B3%95/index.xml" rel="self" type="application/rss+xml"/><item><title>五分钟学会 Kotlin 语法</title><link>https://pangyd.com/post/184-kotlin/</link><pubDate>Wed, 29 Nov 2017 11:03:22 +0800</pubDate><guid>https://pangyd.com/post/184-kotlin/</guid><description>&lt;pre>&lt;div>&lt;h2>为什么使用Kotlin&lt;/h2>
&lt;p>项目一期在收尾了终于有时间折腾了，一个多月以来Kotlin从入门到现在，坚持用来开发的切身感受。因为语法与Java的区别挺大的一开始很想放弃，如果不是因为项目在使用，想必很少人会尝试这样一门小众语言，但是习惯后会发现这些年究竟浪费多少时间在写无用的Java代码了，Kotlin在兼容Java的基础上还能大大提升开发效率。Kotlin有许多特性但对于开发来说，快速适应和学习更为重要，很多时候我们都是在不明白其原因就开始使用的，正如我们不可能把Retrofit原理研究透才使用它。只要它足够稳定成熟，并能有效的提升开发效率都是值得尝试的。鄙人不才，目前使用Kotlin的原因主要是因为它语法简洁，支持lambda表达式，强大的when语法，不用写分号结尾，光是这些就足以让我喜欢Kotlin。至于空安全之类的特性，毕竟服务端数据类型太多null了并没多大感触，这些特性在实际应用中潜移默化的就吸收了，以至于现在遇到几个Java编写的代码，都有些不适应了。&lt;/p>
&lt;h2>修改说明&lt;/h2>
&lt;p>突然火了一脸懵逼，Google IO的影响真是不容小觑。避免误人子弟还是修改下比较好，也就把上一篇文章的基础知识也搬迁过来，对条件判断&lt;code>when&lt;/code>还有空判断处理进行了修改，添加了&lt;code>lambda&lt;/code>说明，移除过期链接。&lt;/p>
&lt;h2>Kotlin 基本语法&lt;/h2>
&lt;p>先说个学习Kotlin语法的小窍门，将代码用Java写好，然后&lt;code>Code/Conver Java File to Kotlin File&lt;/code>转换成Kotlin代码，或者将Java代码复制到Kotlin文件会提示转换也是挺方便的，比较差异很容易就能理解了，一开始难免不适应习惯后相信你一定会喜欢上Kotlin&lt;/p>
&lt;p>1). 定义&lt;/p>
&lt;p>忘掉Java的那一套写法不然会很不适应的，Kotlin有自己的特性不该被Java的思维所束缚。在Kotlin中常量用&lt;code>val&lt;/code>声明，变了用&lt;code>var&lt;/code>声明，关键字在前面，类型以冒号&lt;code>:&lt;/code>隔开在后面，也可以省略直接赋值，类型后带问号&lt;code>?&lt;/code>表示可为空类型(默认空安全)。&lt;br>
常量&lt;code>val&lt;/code>延迟加载&lt;code>by lazy{}&lt;/code>，默认线程安全关闭线程安全&lt;code>lazy(LazyThreadSafetyMode.NONE){}&lt;/code>，变量&lt;code>var&lt;/code>延迟加载&lt;code>lateinit&lt;/code>。&lt;/p>
&lt;pre class="hljs java">&lt;code class="java">&lt;span class="hljs-comment">//常量数组int[][][] arrs = new int[3][2][1];&lt;/span>
val arrs = Array(&lt;span class="hljs-number">3&lt;/span>) { Array(&lt;span class="hljs-number">2&lt;/span>) { IntArray(&lt;span class="hljs-number">1&lt;/span>) } }
&lt;span class="hljs-comment">//空安全变量&lt;/span>
var str: String = &lt;span class="hljs-string">"hello"&lt;/span>
var str1 = &lt;span class="hljs-string">"word"&lt;/span>
&lt;span class="hljs-comment">//可为空字符串变量&lt;/span>
var str2: String? = &lt;span class="hljs-keyword">null&lt;/span>

&lt;/code>&lt;/pre>
&lt;p>2). 条件&lt;/p>
&lt;p>&lt;code>if...else&lt;/code> 正常使用，不过移除了&lt;code>switch&lt;/code>用更强大的&lt;code>when&lt;/code>替代，when子式可以是常量、变量、返回数值的表达式、返回Boolean值的表达式，强大到用来替换&lt;code>if...else if&lt;/code>&lt;/p>
&lt;pre class="hljs java">&lt;code class="java">&lt;span class="hljs-comment">// 测试值 x = 0, -1, 1, 2, 3, 6, 10&lt;/span>
var x = &lt;span class="hljs-number">10&lt;/span>
when (x) {
 &lt;span class="hljs-comment">//常量&lt;/span>
 &lt;span class="hljs-number">2&lt;/span> -&amp;gt; println(&lt;span class="hljs-string">"等于2"&lt;/span>)
 &lt;span class="hljs-comment">//数值表达式&lt;/span>
 &lt;span class="hljs-keyword">if&lt;/span> (x &amp;gt; &lt;span class="hljs-number">0&lt;/span>) &lt;span class="hljs-number">1&lt;/span> &lt;span class="hljs-keyword">else&lt;/span> -&lt;span class="hljs-number">1&lt;/span> -&amp;gt; println(&lt;span class="hljs-string">"大于0并等于1，或小于0并等于-1"&lt;/span>)
 &lt;span class="hljs-comment">//Boolean类型表达式&lt;/span>
 in &lt;span class="hljs-number">1&lt;/span>..&lt;span class="hljs-number">5&lt;/span> -&amp;gt; println(&lt;span class="hljs-string">"范围匹配1-5"&lt;/span>)
 !in &lt;span class="hljs-number">6&lt;/span>..&lt;span class="hljs-number">9&lt;/span> -&amp;gt; println(&lt;span class="hljs-string">"不是6-9"&lt;/span>)
 is Int -&amp;gt; println(&lt;span class="hljs-string">"类型判断"&lt;/span>)
 &lt;span class="hljs-keyword">else&lt;/span> -&amp;gt; println(&lt;span class="hljs-string">"else"&lt;/span>)
}
&lt;span class="hljs-comment">// 代替if...else if&lt;/span>
when{
 x &amp;gt; &lt;span class="hljs-number">6&lt;/span> &amp;amp;&amp;amp; x &amp;lt;= &lt;span class="hljs-number">10&lt;/span> -&amp;gt; println(&lt;span class="hljs-string">"大于6小于等于10"&lt;/span>)
 x &amp;lt; &lt;span class="hljs-number">6&lt;/span> -&amp;gt; println(&lt;span class="hljs-string">"小于6"&lt;/span>)
 &lt;span class="hljs-keyword">else&lt;/span> -&amp;gt; println(&lt;span class="hljs-string">"else"&lt;/span>)
}
&lt;/code>&lt;/pre>
&lt;p>3). 循环&lt;/p></description></item></channel></rss>