Skip to content

Instantly share code, notes, and snippets.

@jdlrobson
Created March 24, 2022 20:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jdlrobson/3aa1e48808b24146e883aa84dfb220a2 to your computer and use it in GitHub Desktop.
Save jdlrobson/3aa1e48808b24146e883aa84dfb220a2 to your computer and use it in GitHub Desktop.
<!DOCTYPE html><html about="http://zh.wikipedia.beta.wmflabs.org/wiki/Special:Redirect/revision/18225" class="no-editing"><head><title>Kotlin</title><meta property="mw:pageNamespace" content="0"><meta property="mw:pageId" content="4471"><meta property="dc:modified" content="2021-11-29T11:00:59Z"><link rel="dc:isVersionOf" href="//zh.wikipedia.beta.wmflabs.org/wiki/Kotlin"><base href="//zh.wikipedia.beta.wmflabs.org/wiki/"><link rel="stylesheet" href="//meta.wikimedia.org/api/rest_v1/data/css/mobile/base"><link rel="stylesheet" href="//zh.wikipedia.beta.wmflabs.org/api/rest_v1/data/css/mobile/site"><link rel="stylesheet" href="//meta.wikimedia.org/api/rest_v1/data/css/mobile/pcs"><meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no"><script src="//meta.wikimedia.org/api/rest_v1/data/javascript/mobile/pcs"></script><link rel="icon" href="data:,"><meta property="pcs:locale" content="zh"><meta property="mw:leadImage" content="https://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Kotlin_Icon.svg/langzh-512px-Kotlin_Icon.svg.png" data-file-width="512" data-file-height="512"></head><body dir="ltr" class="content skin-minerva"><div id="pcs" class="mw-parser-output"><script>pcs.c1.Page.onBodyStart();</script><header><div class="pcs-edit-section-header v2"><h1 data-id="0" class="pcs-edit-section-title">Kotlin</h1></div><hr id="pcs-edit-section-divider"></header><section data-mw-section-id="0" id="content-block-0"><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=0" data-id="0" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span><p><b>Kotlin</b>是一種在<span class="new">Java虛擬機</span>上執行的<span class="new">靜態型別</span><span class="new">程式語言</span>,它也可以被編譯成為<span class="new">JavaScript</span>原始碼。它主要是由<span class="new">俄羅斯</span><span class="new">聖彼得堡</span>的<span class="new">JetBrains</span>開發團隊所發展出來的程式語言,其名稱來自於聖彼得堡附近的<span class="new">科特林島</span>。<sup id="cite_ref-oracle_interview_1-0" class="reference"><a href="#cite_note-oracle_interview-1">[1]</a></sup>2012年1月,著名期刊《<span class="ilh-all" data-orig-title="Dr. Dobb's Journal" data-lang-code="en" data-lang-name="英语" data-foreign-title="Dr. Dobb's Journal"><span class="ilh-page"><span class="new">Dr. Dobb's Journal</span></span><span class="noprint ilh-comment">(<span class="ilh-lang">英语</span><span class="ilh-colon">:</span><span class="ilh-link"><a href="//en.wikipedia.beta.wmflabs.org/wiki/Dr._Dobb%27s_Journal" class="extiw" title="en:Dr. Dobb's Journal"><span dir="auto">Dr. Dobb's Journal</span></a></span>)</span></span>》中Kotlin被认定为該月的最佳語言。<sup id="cite_ref-dobbs_2-0" class="reference"><a href="#cite_note-dobbs-2">[2]</a></sup>雖然与Java語法並不相容,但在<span class="new">JVM</span>環境中Kotlin被設計成可以和Java程式碼相互運作,並可以重複使用如<span class="new">Java集合框架</span>等的現有<span class="ilh-all" data-orig-title="Java引用的函数库" data-lang-code="en" data-lang-name="英语" data-foreign-title="Java Class Library"><span class="ilh-page"><span class="new">Java引用的函数库</span></span><span class="noprint ilh-comment">(<span class="ilh-lang">英语</span><span class="ilh-colon">:</span><span class="ilh-link"><a href="//en.wikipedia.beta.wmflabs.org/wiki/Java_Class_Library" class="extiw" title="en:Java Class Library"><span dir="auto">Java Class Library</span></a></span>)</span></span>。Hathibelagal写道,“如果你正在为Android开发寻找一种替代编程语言,那么应该试下Kotlin。它很容易在Android项目中替代Java或者同Java一起使用。”
</p><div id="noteTA-ea17aca7" class="noteTA"><div class="noteTA-group"><div data-noteta-group-source="module" data-noteta-group="IT"></div></div></div>
<div class="pcs-collapse-table-container"><div class="pcs-collapse-table-collapsed-container pcs-collapse-table-expanded" style="display: block;"><strong class="pcs-table-infobox">快速预览</strong><span class="pcs-collapse-table-collapse-text">: 設計者, 實作者 ...</span><span class="pcs-collapse-table-aria" aria-labelledby="pcs-collapse-table-aria-expand" role="button" display="none"><span id="pcs-collapse-table-aria-expand" aria-label="展开表格"></span><span id="pcs-collapse-table-aria-collapse" aria-label="折叠表格"></span></span></div><div class="pcs-collapse-table-content" style="display: none;"><table class="infobox vevent pcs-collapse-table" cellspacing="3" style="border-spacing:3px;width:22em;text-align:left;font-size:small;line-height:1.5em"><caption class="summary"><b>Kotlin</b></caption><tbody><tr><td colspan="2" style="text-align:center">
<figure class="mw-default-size"><a href="./File:Kotlin_Icon.svg" class="image" title="Kotlin 圖標"><span class="pcs-lazy-load-placeholder pcs-lazy-load-placeholder-pending" style="width: 152px;" data-src="//upload.wikimedia.org/wikipedia/commons/thumb/0/06/Kotlin_Icon.svg/langzh-152px-Kotlin_Icon.svg.png" data-srcset="https://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Kotlin_Icon.svg/langzh-228px-Kotlin_Icon.svg.png 1.5x, https://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Kotlin_Icon.svg/langzh-304px-Kotlin_Icon.svg.png 2x" data-width="152" data-height="152" data-alt="Kotlin 圖標" data-data-file-width="512" data-data-file-height="512"><span style="padding-top: 100%;"></span></span></a></figure></td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;">設計者</th><td style="">
<span class="new">JetBrains</span></td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;">實作者</th><td class="organiser" style="">
JetBrains與開源貢獻者</td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;">发行时间</th><td style="">
2011</td></tr><tr><td colspan="2" style="text-align:center;">
</td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;;"><span class="new">穩定版本</span></th><td style="">
<div>1.5.21
<div style="display:inline">(2021年7月13日<span class="noprint">,​6個月前</span><span style="display:none">​(<span class="bday dtstart published updated">2021-07-13</span>)</span>
)</div></div></td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;"><span class="new">型態系統</span></th><td style="">
<span class="new">靜態類型</span>、<span class="new">类型推论</span></td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;"><span class="new">系统平台</span></th><td style="">
輸出<span class="new">Java虛擬機</span>、<span class="new">Java字节码</span>以及<span class="new">JavaScript</span><span class="new">原始碼</span></td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;"><span class="new">作業系統</span></th><td style="">
任何支援<span class="new">JVM</span>或是<span class="new">JavaScript</span>的直譯器</td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;"><span class="new">許可證</span></th><td style="">
<span class="new">Apache 2</span></td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;"><span class="new">文件扩展名</span></th><td style="">
<span class="new">Template:Mono</span> <span class="new">Template:Mono</span></td></tr><tr><th scope="row" style="text-align:left;white-space: nowrap;">網站</th><td style="">
<span class="url"><a rel="nofollow" class="external text" href="http://kotlinlang.org">kotlinlang<wbr>.org</a></span></td></tr><tr><th colspan="2" style="text-align:center;background-color: #eee;;" class="notheme">啟發語言</th></tr><tr><td colspan="2" style="text-align:center;">
<span class="new">Java</span>、<span class="new">Scala</span>、<span class="new">Groovy</span>、<span class="new">C#</span>、<span class="ilh-all" data-orig-title="Gosu" data-lang-code="en" data-lang-name="英语" data-foreign-title="Gosu"><span class="ilh-page"><span class="new">Gosu</span></span><span class="noprint ilh-comment">(<span class="ilh-lang">英语</span><span class="ilh-colon">:</span><span class="ilh-link"><a href="//en.wikipedia.beta.wmflabs.org/wiki/Gosu" class="extiw" title="en:Gosu"><span dir="auto">Gosu</span></a></span>)</span></span></td></tr></tbody></table></div><div class="pcs-collapse-table-collapsed-bottom pcs-collapse-table-icon" style="display: none;">关闭</div></div></section><section data-mw-section-id="1" style="display: none;"><div class="pcs-edit-section-header v2"><h2 id="历史" class="pcs-edit-section-title">历史</h2><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=1" data-id="1" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言,它已被开发一年之久。<sup id="cite_ref-announce_3-0" class="reference"><a href="#cite_note-announce-3">[3]</a></sup>JetBrains负责人Dmitry Jemerov说,大多数语言没有他们正在寻找的特性,但是<span class="new">Scala</span>除外。但是,他指出Scala的编译时间過慢这一明显缺陷。<sup id="cite_ref-announce_3-1" class="reference"><a href="#cite_note-announce-3">[3]</a></sup>Kotlin的既定目标之一是像Java一样快速编译。2012年2月,JetBrains以<span class="new">Apache 2许可证</span>开源此项目。<sup id="cite_ref-open_source_4-0" class="reference"><a href="#cite_note-open_source-4">[4]</a></sup></p><p>JetBrains希望这个新语言能够推动<span class="new">IntelliJ IDEA</span>的销售。<sup id="cite_ref-5" class="reference"><a href="#cite_note-5">[5]</a></sup></p><p>Kotlin v1.0于2016年2月15日发布。<sup id="cite_ref-6" class="reference"><a href="#cite_note-6">[6]</a></sup>这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性。
</p><p>在<span class="new">Google I/O</span> 2017中,<span class="new">Google</span>宣布在<span class="new">Android</span>上为Kotlin提供最佳支持。<sup id="cite_ref-7" class="reference"><a href="#cite_note-7">[7]</a></sup></p></section><section data-mw-section-id="2" style="display: none;"><div class="pcs-edit-section-header v2"><h2 id="语法" class="pcs-edit-section-title">语法</h2><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=2" data-id="2" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin很明顯受到Java、C#、JavaScript、Scala、Groovy等语言的影响。例如Kotlin可以直接通过<code>println("Hello, ${name}")</code>或<code>println("Hello, $name")</code>来使用字串模板,和古老的shell script类似。又如Kotlin中的分号是可选的,这类似JavaScript,而且Groovy、Scala也有同样的能力。Kotlin常量定义关键字是<code>val</code>(不同於变量定义关键字<code>var</code>),表示固定值,这功能来自Scala,Swift也有类似功能。
</p><p>需要注意,Kotlin没有关键字<code>new</code>。
</p></section><section data-mw-section-id="3" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="變量" class="pcs-edit-section-title">變量</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=3" data-id="3" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>使用<code>val</code>(全稱為value,即(固定的)值)關鍵字定義唯讀变量,定義後其值無法修改<sup id="cite_ref-8" class="reference"><a href="#cite_note-8">[8]</a></sup></p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="kd">val</span> <span class="nv">a</span><span class="p">:</span> <span class="kt">Int</span> <span class="o">=</span> <span class="m">1</span> <span class="c1">// 定義a為`Int`類型的唯讀變量,其值為1</span>
<span class="kd">val</span> <span class="nv">b</span> <span class="o">=</span> <span class="m">2</span> <span class="c1">// 自動檢測b為`Int`類型</span>
</pre></div>
<p>使用<code>var</code>(全稱為variable,即變量)關鍵字定義可變變量。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="kd">var</span> <span class="nv">x</span> <span class="o">=</span> <span class="m">5</span> <span class="c1">// App 定義一個`Int`,值為5</span>
<span class="n">x</span> <span class="o">=</span> <span class="m">1</span> <span class="c1">// 修改值為1</span>
</pre></div></section><section data-mw-section-id="4" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="函数" class="pcs-edit-section-title">函数</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=4" data-id="4" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>使用<code>fun</code>关键字定义一个函数。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="kd">fun</span> <span class="nf">sum</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="kt">Int</span><span class="p">):</span> <span class="kt">Int</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
<span class="p">}</span>
</pre></div>
<p>上例定义了一个传入两个Int变量,并返回两数之和的求和函数。
</p></section><section data-mw-section-id="5" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="程序的入口点" class="pcs-edit-section-title">程序的入口点</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=5" data-id="5" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>类似于 C、 C++、 C#、 Java 和 Go , Kotlin 程序的<span class="new">入口点</span>是一个名为“main”的函数。 main 函数有一个包含命令行选项的参数(从 Kotlin 1.3 开始是可选的)。 Kotlin 支持像 <span class="new">Perl</span> 和 <span class="new">Unix shell</span> 那样的<span class="ilh-all" data-orig-title="字符串模板" data-lang-code="en" data-lang-name="英语" data-foreign-title="String interpolation"><span class="ilh-page"><span class="new">字符串模板</span></span><span class="noprint ilh-comment">(<span class="ilh-lang">英语</span><span class="ilh-colon">:</span><span class="ilh-link"><a href="//en.wikipedia.beta.wmflabs.org/wiki/String_interpolation" class="extiw" title="en:String interpolation"><span dir="auto">String interpolation</span></a></span>)</span></span>。 <span class="new">类型推断</span>也是支持的。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="c1">// Hello, world! 範例</span>
<span class="kd">fun</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">val</span> <span class="nv">scope</span> <span class="o">=</span> <span class="s">"World"</span>
<span class="n">println</span><span class="p">(</span><span class="s">"Hello, </span><span class="si">$</span><span class="n">scope</span><span class="s">!"</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">fun</span> <span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="p">:</span> <span class="n">Array</span><span class="o">&lt;</span><span class="kt">String</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>
<span class="k">for</span> <span class="p">(</span><span class="n">arg</span> <span class="k">in</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
<span class="n">println</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div></section><section data-mw-section-id="6" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="函数扩展" class="pcs-edit-section-title">函数扩展</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=6" data-id="6" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin與C#、JavaScript类似,能够扩展類別的新功能,而无需继承该類別,或使用像装饰器(decorator)这样的任何类型的设计模式(design pattern)。扩展函数可以称为Kotlin的核心,在标准库里到处充斥着扩展函数。
</p><p>扩展函数是静态分发的,也就是說,它们不是以接收者类型为准的虚擬函數。这意味着调用的扩展函数是由函数调用所在的表达式的类型来决定的,而不是由表达式运行时求值结果决定的。
</p><p>在下述例子中,String類別被扩展出一個成员lastChar。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="k">package</span> <span class="nn">MyStringExtensions</span>
<span class="kd">fun</span> <span class="n">String</span><span class="p">.</span><span class="nf">lastChar</span><span class="p">():</span> <span class="kt">Char</span> <span class="o">=</span> <span class="k">get</span><span class="p">(</span><span class="n">length</span> <span class="o">-</span> <span class="m">1</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">println</span><span class="p">(</span><span class="s">"Kotlin"</span><span class="p">.</span><span class="na">lastChar</span><span class="p">())</span>
</pre></div>
<p>利用函数扩展,Kotlin也支持<span class="new">运算符重载</span>:
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="c1">// overloading '+' operator using an extension method</span>
<span class="kd">operator</span> <span class="kd">fun</span> <span class="n">Point</span><span class="p">.</span><span class="nf">plus</span><span class="p">(</span><span class="n">other</span><span class="p">:</span> <span class="n">Point</span><span class="p">):</span> <span class="n">Point</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">other</span><span class="p">.</span><span class="na">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">other</span><span class="p">.</span><span class="na">y</span><span class="p">)</span>
<span class="p">}</span>
<span class="o">&gt;&gt;&gt;</span> <span class="kd">val</span> <span class="nv">p1</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="m">10</span><span class="p">,</span> <span class="m">20</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="kd">val</span> <span class="nv">p2</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="m">30</span><span class="p">,</span> <span class="m">40</span><span class="p">)</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">println</span><span class="p">(</span><span class="n">p1</span> <span class="o">+</span> <span class="n">p2</span><span class="p">)</span>
<span class="n">Point</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="m">40</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="m">60</span><span class="p">)</span>
</pre></div></section><section data-mw-section-id="7" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="getter和setter" class="pcs-edit-section-title">getter和setter</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=7" data-id="7" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin像C#一样支持属性(property)。
</p></section><section data-mw-section-id="8" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="解包引數" class="pcs-edit-section-title">解包引數</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=8" data-id="8" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>類似Python, 解包(unpack)指的是对实际参数的解包,只需在前面加一个星號* 即可,如test(*a):
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="kd">fun</span> <span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="p">:</span> <span class="n">Array</span><span class="o">&lt;</span><span class="kt">String</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">val</span> <span class="nv">list</span> <span class="o">=</span> <span class="n">listOf</span><span class="p">(</span><span class="s">"args: "</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="n">println</span><span class="p">(</span><span class="n">list</span><span class="p">)</span>
<span class="p">}</span>
</pre></div></section><section data-mw-section-id="9" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="函数嵌套" class="pcs-edit-section-title">函数嵌套</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=9" data-id="9" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin支持函数嵌套(nested functions),允許函數内再定义函數,類似JavaScript、C#与Python语言。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="kd">class</span> <span class="nc">User</span><span class="p">(</span>
<span class="kd">val</span> <span class="nv">id</span><span class="p">:</span> <span class="kt">Int</span><span class="p">,</span>
<span class="kd">val</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span>
<span class="kd">val</span> <span class="nv">address</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">fun</span> <span class="nf">saveUser</span><span class="p">(</span><span class="n">user</span><span class="p">:</span> <span class="n">User</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">fun</span> <span class="nf">validate</span><span class="p">(</span><span class="n">user</span><span class="p">:</span> <span class="n">User</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="n">fieldName</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">value</span><span class="p">.</span><span class="na">isBlank</span><span class="p">())</span> <span class="p">{</span>
<span class="k">throw</span> <span class="n">IllegalArgumentException</span><span class="p">(</span>
<span class="s">"Can't save user </span><span class="si">${</span><span class="n">user</span><span class="p">.</span><span class="na">id</span><span class="si">}</span><span class="s">: empty </span><span class="si">$</span><span class="n">fieldName</span><span class="s">"</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">validate</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">user</span><span class="p">.</span><span class="na">name</span><span class="p">,</span> <span class="s">"Name"</span><span class="p">)</span>
<span class="n">validate</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">user</span><span class="p">.</span><span class="na">address</span><span class="p">,</span> <span class="s">"Address"</span><span class="p">)</span>
<span class="c1">// Save user to the database</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div></section><section data-mw-section-id="10" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="解构声明" class="pcs-edit-section-title">解构声明</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=10" data-id="10" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin支持解构声明,这与Python的迭代解包相似。
</p><p>例如, collection object 包含解構式可分離其元素:
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="k">for</span> <span class="p">((</span><span class="n">index</span><span class="p">,</span> <span class="n">element</span><span class="p">)</span> <span class="k">in</span> <span class="n">collection</span><span class="p">.</span><span class="na">withIndex</span><span class="p">())</span> <span class="p">{</span>
<span class="n">println</span><span class="p">(</span><span class="s">"</span><span class="si">$</span><span class="n">index</span><span class="s">: </span><span class="si">$</span><span class="n">element</span><span class="s">"</span><span class="p">)</span>
<span class="p">}</span>
</pre></div></section><section data-mw-section-id="11" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="抽象類別" class="pcs-edit-section-title">抽象類別</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=11" data-id="11" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>抽象類別(Abstract classes)定義抽象或純虚擬(Pure Virtual)占位函数,需要被继承。抽象類別預設是open的。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="c1">// No need for the open keyword here, its already open by default</span>
<span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Animated</span> <span class="p">{</span>
<span class="c1">// This virtual function is already open by default as well</span>
<span class="kd">abstract</span> <span class="kd">fun</span> <span class="nf">animate</span><span class="p">()</span>
<span class="kd">open</span> <span class="kd">fun</span> <span class="nf">stopAnimating</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
<span class="kd">fun</span> <span class="nf">animateTwice</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
<span class="p">}</span>
</pre></div></section><section data-mw-section-id="12" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="類別屬性" class="pcs-edit-section-title">類別屬性</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=12" data-id="12" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin 提供下列的關鍵字來限制顶层(top-level)聲明,用于控制類別与成员在继承时的可见性(作用域)。它们可用於類別及其成員:
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="n">public</span>
<span class="n">internal</span>
<span class="n">protected</span>
<span class="n">private</span>
</pre></div>
<p>用于類別的成员声明时,含义如下:
</p>
<ul><li>public:全局可见。此为默认的类型。</li>
<li>internal:在当前模块中可见。</li>
<li>protected:在当前類別的一级子類別中可见,如果子類別再被继承,则在下一级子類別中不可见。</li>
<li>private:在当前類別中可见。</li></ul><p>用于顶层声明时,含义如下:
</p>
<ul><li>public:全局可见。此为默认的类型。</li>
<li>internal:在当前模块中可见。</li>
<li>private:在当前文件中可见。</li></ul><p>例如:
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="c1">// Class is visible only to current module</span>
<span class="kd">internal</span> <span class="kd">open</span> <span class="kd">class</span> <span class="nc">TalkativeButton</span> <span class="p">:</span> <span class="n">Focusable</span> <span class="p">{</span>
<span class="c1">// method is only visible to current class </span>
<span class="kd">private</span> <span class="kd">fun</span> <span class="nf">yell</span><span class="p">()</span> <span class="o">=</span> <span class="n">println</span><span class="p">(</span><span class="s">"Hey!"</span><span class="p">)</span>
<span class="c1">// method is visible to current class and derived classes</span>
<span class="kd">protected</span> <span class="kd">fun</span> <span class="nf">whisper</span><span class="p">()</span> <span class="o">=</span> <span class="n">println</span><span class="p">(</span><span class="s">"Let's talk!"</span><span class="p">)</span>
<span class="p">}</span>
</pre></div></section><section data-mw-section-id="13" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="主构造函数_vs._二級构造函数" class="pcs-edit-section-title">主构造函数 vs. 二級构造函数</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=13" data-id="13" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>在Kotlin 中類別可以有一个主构造函数以及多个二级构造函数。如果主构造函数没有注解或可见性说明,则<code>constructor</code>关键字可以省略。如果构造函数中没有其它操作,大括号也可以省略。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="c1">// Example of class using primary constructor syntax</span>
<span class="c1">// (Only one constructor required for this class)</span>
<span class="kd">class</span> <span class="nc">User</span><span class="p">(</span>
<span class="kd">val</span> <span class="nv">nickname</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span>
<span class="kd">val</span> <span class="nv">isSubscribed</span><span class="p">:</span> <span class="kt">Boolean</span> <span class="o">=</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
<span class="p">...</span>
<span class="p">}</span>
</pre></div>
<p>Kotlin 的二級构造函数更类似於 C++, C#, 和 Java。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="c1">// Example of class using secondary constructor syntax</span>
<span class="c1">// (more than one constructor required for this class)</span>
<span class="kd">class</span> <span class="nc">MyButton</span> <span class="p">:</span> <span class="n">View</span> <span class="p">{</span>
<span class="c1">// Constructor #1 </span>
<span class="k">constructor</span><span class="p">(</span><span class="n">ctx</span><span class="p">:</span> <span class="n">Context</span><span class="p">)</span> <span class="p">:</span> <span class="k">super</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// ... </span>
<span class="p">}</span>
<span class="c1">// Constructor #2</span>
<span class="k">constructor</span><span class="p">(</span><span class="n">ctx</span><span class="p">:</span> <span class="n">Context</span><span class="p">,</span> <span class="n">attr</span><span class="p">:</span> <span class="n">AttributeSet</span><span class="p">)</span> <span class="p">:</span> <span class="k">super</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// ... </span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div></section><section data-mw-section-id="14" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="Anko_library" class="pcs-edit-section-title">Anko library</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=14" data-id="14" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Anko 是一組為Kotlin 打造的函数库,其功能是用來開發<span class="new">Android</span> UI 應用程式,<sup id="cite_ref-9" class="reference"><a href="#cite_note-9">[9]</a></sup>現已棄用。<sup id="cite_ref-10" class="reference"><a href="#cite_note-10">[10]</a></sup></p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="kd">fun</span> <span class="n">Activity</span><span class="p">.</span><span class="nf">showAreYouSureAlert</span><span class="p">(</span><span class="n">process</span><span class="p">:</span> <span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">Unit</span><span class="p">)</span> <span class="p">{</span>
<span class="n">alert</span><span class="p">(</span>
<span class="n">title</span> <span class="o">=</span> <span class="s">"Are you sure?"</span><span class="p">,</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">"Are you really sure?"</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">positiveButton</span><span class="p">(</span><span class="s">"Yes"</span><span class="p">)</span> <span class="p">{</span> <span class="n">process</span><span class="p">()</span> <span class="p">}</span>
<span class="n">negativeButton</span><span class="p">(</span><span class="s">"No"</span><span class="p">)</span> <span class="p">{</span> <span class="n">cancel</span><span class="p">()</span> <span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div></section><section data-mw-section-id="15" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="Kotlin_交互模式" class="pcs-edit-section-title">Kotlin 交互模式</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=15" data-id="15" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin除了编译成Java字节码运行,也可以作为<span class="new">脚本语言</span>解释运行,此特性使得Kotlin可以以交互模式运行。交互模式是脚本语言具有的特性,解释器可以立即运行用户输入的代码,并反馈运行结果。典型的语言有Python、JavaScript(在V8引擎支持下)、Ruby。
</p>
<div class="mw-highlight mw-highlight-lang-bash mw-content-ltr" dir="ltr"><pre>$ kotlinc-jvm
<span class="nb">type</span> :help <span class="k">for</span> help<span class="p">;</span> :quit <span class="k">for</span> quit
&gt;&gt;&gt; <span class="m">2</span>+2
<span class="m">4</span>
&gt;&gt;&gt; println<span class="o">(</span><span class="s2">"Welcome to the Kotlin Shell"</span><span class="o">)</span>
Welcome to the Kotlin Shell
&gt;&gt;&gt;
</pre></div></section><section data-mw-section-id="16" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="Kotlin_也是腳本語言" class="pcs-edit-section-title">Kotlin 也是腳本語言</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=16" data-id="16" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin 亦可視為腳本語言(scripting language)。其腳本存成 Kotlin source file (.kts),即成為可執行檔。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="c1">// list_folders.kts</span>
<span class="k">import</span> <span class="nn">java.io.File</span>
<span class="kd">val</span> <span class="nv">folders</span> <span class="o">=</span> <span class="n">File</span><span class="p">(</span><span class="n">args</span><span class="o">[</span><span class="m">0</span><span class="o">]</span><span class="p">).</span><span class="na">listFiles</span> <span class="p">{</span> <span class="n">file</span> <span class="o">-&gt;</span> <span class="n">file</span><span class="p">.</span><span class="na">isDirectory</span><span class="p">()</span> <span class="p">}</span>
<span class="n">folders</span><span class="o">?.</span><span class="na">forEach</span> <span class="p">{</span> <span class="n">folder</span> <span class="o">-&gt;</span> <span class="n">println</span><span class="p">(</span><span class="n">folder</span><span class="p">)</span> <span class="p">}</span>
</pre></div>
<p>為了執行Kotlin 脚本,我們在运行编譯器時再加上<span class="new">Template:Mono</span>選項。
</p>
<div class="mw-highlight mw-highlight-lang-bash mw-content-ltr mw-highlight-lines" dir="ltr"><pre>$ kotlinc -script list_folders.kts <span class="s2">"path_to_folder_to_inspect"</span>
</pre></div></section><section data-mw-section-id="17" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="Kotlin_的_hello_world_例子" class="pcs-edit-section-title">Kotlin 的 hello world 例子</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=17" data-id="17" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="kd">fun</span> <span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="p">:</span> <span class="n">Array</span><span class="o">&lt;</span><span class="kt">String</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>
<span class="n">greet</span> <span class="p">{</span>
<span class="n">to</span><span class="p">.</span><span class="na">place</span>
<span class="p">}.</span><span class="na">print</span><span class="p">()</span>
<span class="p">}</span>
<span class="c1">//inline higher-order functions</span>
<span class="kd">inline</span> <span class="kd">fun</span> <span class="nf">greet</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="p">()</span> <span class="o">-&gt;</span> <span class="kt">String</span><span class="p">)</span> <span class="p">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="n">greeting</span> <span class="n">andAnother</span> <span class="n">s</span><span class="p">()</span>
<span class="c1">//infix functions, extensions, type inference, nullable types, lambda expressions, labeled this, elvis operator</span>
<span class="kd">infix</span> <span class="kd">fun</span> <span class="n">String</span><span class="p">.</span><span class="nf">andAnother</span><span class="p">(</span><span class="n">other</span> <span class="p">:</span> <span class="kt">Any?</span><span class="p">)</span> <span class="o">=</span> <span class="n">buildString</span><span class="p">()</span> <span class="p">{</span> <span class="n">append</span><span class="p">(</span><span class="k">this</span><span class="nd">@andAnother</span><span class="p">);</span> <span class="n">append</span><span class="p">(</span><span class="s">" "</span><span class="p">);</span> <span class="n">append</span><span class="p">(</span><span class="n">other</span> <span class="o">?:</span> <span class="s">""</span><span class="p">)</span> <span class="p">}</span>
<span class="c1">//immutable types, delegated properties, lazy initialization, string templates</span>
<span class="kd">val</span> <span class="nv">greeting</span> <span class="k">by</span> <span class="n">lazy</span> <span class="p">{</span> <span class="kd">val</span> <span class="nv">doubleEl</span><span class="p">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="s">"ll"</span><span class="p">;</span> <span class="s">"he</span><span class="si">${</span><span class="n">doubleEl</span><span class="si">}</span><span class="s">o"</span> <span class="p">}</span>
<span class="c1">//sealed classes, companion objects</span>
<span class="kd">sealed</span> <span class="kd">class</span> <span class="nc">to</span> <span class="p">{</span> <span class="kd">companion</span> <span class="kd">object</span> <span class="err">{ </span><span class="nc">val</span> <span class="n">place</span> <span class="o">=</span> <span class="s">"world"</span><span class="p">}</span> <span class="p">}</span>
<span class="c1">//extensions, Unit</span>
<span class="kd">fun</span> <span class="n">String</span><span class="p">.</span><span class="nf">print</span><span class="p">()</span> <span class="o">=</span> <span class="n">println</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
</pre></div></section><section data-mw-section-id="18" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="空变量及其运算" class="pcs-edit-section-title">空变量及其运算</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=18" data-id="18" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin对可以为空(nullable)的变量和不可以为空(non-nullable)的变量作了区分。所有的可空对象(nullable objects)必須在定义時加上 "?" 後置於类型之後。開發人员遇到nullable objects時要先確認: null-check 須被執行過,才能赋值。可空性是Kotlin类型系统中帮助开发者避免以往Java的<span class="new">NullPointerException</span>错误的特性。
</p><p>Kotlin 提供空安全(null-safe)运算符給開發人員:
</p>
<ul><li><span class="new">Template:Mono</span> (<span class="ilh-all" data-orig-title="Safe navigation operator" data-lang-code="en" data-lang-name="英语" data-foreign-title="Safe navigation operator"><span class="ilh-page"><span class="new">Safe navigation operator</span></span><span class="noprint ilh-comment">(<span class="ilh-lang">英语</span><span class="ilh-colon">:</span><span class="ilh-link"><a href="//en.wikipedia.beta.wmflabs.org/wiki/Safe_navigation_operator" class="extiw" title="en:Safe navigation operator"><span dir="auto">Safe navigation operator</span></a></span>)</span></span>) 可用於安全存取(safely access) 可能是空对象的函數或屬性。如果 object 為空(null), 该方法將不被调用,而且表达式的值一定為空(null)。</li>
<li><span class="new">Template:Mono</span> (<span class="ilh-all" data-orig-title="Null coalescing operator" data-lang-code="en" data-lang-name="英语" data-foreign-title="Null coalescing operator"><span class="ilh-page"><span class="new">Null coalescing operator</span></span><span class="noprint ilh-comment">(<span class="ilh-lang">英语</span><span class="ilh-colon">:</span><span class="ilh-link"><a href="//en.wikipedia.beta.wmflabs.org/wiki/Null_coalescing_operator" class="extiw" title="en:Null coalescing operator"><span dir="auto">Null coalescing operator</span></a></span>)</span></span>) 通常稱為<span class="ilh-all" data-orig-title="艾维斯运算符" data-lang-code="en" data-lang-name="英语" data-foreign-title="Elvis operator"><span class="ilh-page"><span class="new">艾维斯运算符</span></span><span class="noprint ilh-comment">(<span class="ilh-lang">英语</span><span class="ilh-colon">:</span><span class="ilh-link"><a href="//en.wikipedia.beta.wmflabs.org/wiki/Elvis_operator" class="extiw" title="en:Elvis operator"><span dir="auto">Elvis operator</span></a></span>)</span></span>(Elvis operator):</li></ul><div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="kd">fun</span> <span class="nf">sayHello</span><span class="p">(</span><span class="n">maybe</span><span class="p">:</span> <span class="kt">String?</span><span class="p">,</span> <span class="n">neverNull</span><span class="p">:</span> <span class="kt">Int</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// use of elvis operator</span>
<span class="kd">val</span> <span class="nv">name</span><span class="p">:</span> <span class="kt">String</span> <span class="o">=</span> <span class="n">maybe</span> <span class="o">?:</span> <span class="s">"stranger"</span>
<span class="n">println</span><span class="p">(</span><span class="s">"Hello </span><span class="si">$</span><span class="n">name</span><span class="s">"</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
<p>使用安全導引(safe navigation)运算符:
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="c1">// returns null if...</span>
<span class="c1">// - foo() returns null,</span>
<span class="c1">// - or if foo() is non-null, but bar() returns null,</span>
<span class="c1">// - or if foo() and bar() are non-null, but baz() returns null.</span>
<span class="c1">// vice versa, return value is non-null if and only if foo(), bar() and baz() are non-null</span>
<span class="n">foo</span><span class="p">()</span><span class="o">?.</span><span class="na">bar</span><span class="p">()</span><span class="o">?.</span><span class="na">baz</span><span class="p">()</span>
</pre></div></section><section data-mw-section-id="19" style="display: none;"><div class="pcs-edit-section-header v2"><h3 id="高阶函数与lambda" class="pcs-edit-section-title">高阶函数与lambda</h3><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=19" data-id="19" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><p>Kotlin 亦支持高阶函数和lambdas功能。lambda是一种匿名函数,允许开发者直接将表达式定义为函数,这类似于Python。<sup id="cite_ref-11" class="reference"><a href="#cite_note-11">[11]</a></sup></p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="c1">// the following function takes a lambda, f, and executes f passing it the string, "lambda"</span>
<span class="c1">// note that (s: String) -&gt; Unit indicates a lambda with a String parameter and Unit return type</span>
<span class="kd">fun</span> <span class="nf">executeLambda</span><span class="p">(</span><span class="n">f</span><span class="p">:</span> <span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="kt">String</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">Unit</span><span class="p">)</span> <span class="p">{</span>
<span class="n">f</span><span class="p">(</span><span class="s">"lambda"</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
<p>Lambdas 可用大括弧<span class="new">Template:Mono</span>來定义。如果lambda 夾帶參數,他們可定义在大括弧内,並以<span class="new">Template:Mono</span>运算符區隔。
</p>
<div class="mw-highlight mw-highlight-lang-kotlin mw-content-ltr" dir="ltr"><pre><span class="c1">// the following statement defines a lambda that takes a single parameter and passes it to the println function</span>
<span class="kd">val</span> <span class="nv">l</span> <span class="o">=</span> <span class="p">{</span> <span class="n">c</span> <span class="p">:</span> <span class="kt">Any?</span> <span class="o">-&gt;</span> <span class="n">println</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="p">}</span>
<span class="c1">// lambdas with no parameters may simply be defined using { }</span>
<span class="kd">val</span> <span class="nv">l2</span> <span class="o">=</span> <span class="p">{</span> <span class="n">print</span><span class="p">(</span><span class="s">"no parameters"</span><span class="p">)</span> <span class="p">}</span>
</pre></div></section><hr class="pcs-fold-hr"><section data-mw-section-id="20" style="display: none;"><div class="pcs-edit-section-header v2 pcs-section-hideable-header" onclick="pcs.c1.Sections.setHidden('20', false);"><span id="pcs-section-control-20" class="pcs-section-control pcs-section-control-show" role="button" aria-labelledby="pcs-section-aria-expand"></span><h2 id="参考资料" class="pcs-edit-section-title">参考资料</h2><span class="pcs-edit-section-link-container"><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=20" data-id="20" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div><div id="pcs-section-content-20" class="pcs-section-hidden"><div class="reflist" style="list-style-type: decimal;">
<div class="mw-references-wrap mw-references-columns"><div class="mw-references-wrap" about="#mwt1000"><ol class="references mw-references"><li id="cite_note-oracle_interview-1"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-oracle_interview-1" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-oracle_interview-1" pcs-back-links="[&quot;#cite_ref-oracle_interview_1-0&quot;]">[1]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web">Heiss, Janice. <a rel="nofollow" class="external text" href="http://www.oracle.com/technetwork/articles/java/breslav-1932170.html">The Advent of Kotlin: A Conversation with JetBrains' Andrey Breslav</a>. oracle.com. Oracle Technology Network. April 2013 <span class="reference-accessdate"> [<span class="nowrap">February 2,</span> 2014]</span>. (原始内容<a rel="nofollow" class="external text" href="//web.archive.org/web/20170508184943/http://www.oracle.com/technetwork/articles/java/breslav-1932170.html">存档</a>于2017-05-08).</cite></span></div></div></li>
<li id="cite_note-dobbs-2"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-dobbs-2" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-dobbs-2" pcs-back-links="[&quot;#cite_ref-dobbs_2-0&quot;]">[2]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web">Breslav, Andrey. <a rel="nofollow" class="external text" href="//web.archive.org/web/20151022062235/http://www.drdobbs.com/jvm/language-of-the-month-kotlin/232600836">Language of the Month: Kotlin</a>. drdobbs.com. January 20, 2012 <span class="reference-accessdate"> [<span class="nowrap">February 2,</span> 2014]</span>. (<a rel="nofollow" class="external text" href="http://www.drdobbs.com/jvm/language-of-the-month-kotlin/232600836">原始内容</a>存档于2015-10-22).</cite></span></div></div></li>
<li id="cite_note-announce-3"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-announce-3" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-announce-3" pcs-back-links="[&quot;#cite_ref-announce_3-0&quot;,&quot;#cite_ref-announce_3-1&quot;]">[3]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web">Krill, Paul. <a rel="nofollow" class="external text" href="http://www.infoworld.com/d/application-development/jetbrains-readies-jvm-based-language-167875">JetBrains readies JVM language Kotlin</a>. infoworld.com. InfoWorld. Jul 22, 2011 <span class="reference-accessdate"> [<span class="nowrap">February 2,</span> 2014]</span>. (原始内容<a rel="nofollow" class="external text" href="//web.archive.org/web/20140715172505/http://www.infoworld.com/d/application-development/jetbrains-readies-jvm-based-language-167875">存档</a>于2014-07-15).</cite></span></div></div></li>
<li id="cite_note-open_source-4"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-open_source-4" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-open_source-4" pcs-back-links="[&quot;#cite_ref-open_source_4-0&quot;]">[4]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web">Waters, John. <a rel="nofollow" class="external text" href="//web.archive.org/web/20160329122131/https://adtmag.com/articles/2012/02/22/kotlin-goes-open-source.aspx">Kotlin Goes Open Source</a>. ADTmag.com/. 1105 Enterprise Computing Group. February 22, 2012 <span class="reference-accessdate"> [<span class="nowrap">February 2,</span> 2014]</span>. (<a rel="nofollow" class="external text" href="http://adtmag.com/articles/2012/02/22/kotlin-goes-open-source.aspx">原始内容</a>存档于2016-03-29).</cite></span></div></div></li>
<li id="cite_note-5"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-5" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-5" pcs-back-links="[&quot;#cite_ref-5&quot;]">[5]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="//web.archive.org/web/20140421050853/http://blog.jetbrains.com/kotlin/2011/08/why-jetbrains-needs-kotlin/">Why JetBrains needs Kotlin</a>. <span class="reference-accessdate"> [<span class="nowrap">2017-05-18</span>]</span>. (<a rel="nofollow" class="external text" href="http://blog.jetbrains.com/kotlin/2011/08/why-jetbrains-needs-kotlin/">原始内容</a>存档于2014-04-21). <q>we expect Kotlin to drive the sales of IntelliJ IDEA</q></cite></span></div></div></li>
<li id="cite_note-6"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-6" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-6" pcs-back-links="[&quot;#cite_ref-6&quot;]">[6]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/">Kotlin 1.0 Released: Pragmatic Language for JVM and Android | Kotlin Blog</a>. Blog.jetbrains.com. 2016-02-15 <span class="reference-accessdate"> [<span class="nowrap">2017-04-11</span>]</span>. (原始内容<a rel="nofollow" class="external text" href="//web.archive.org/web/20161022042831/https://blog.jetbrains.com/kotlin/2016/02/kotlin-1-0-released-pragmatic-language-for-jvm-and-android/">存档</a>于2016-10-22).</cite></span></div></div></li>
<li id="cite_note-7"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-7" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-7" pcs-back-links="[&quot;#cite_ref-7&quot;]">[7]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web">Shafirov, Maxim. <a rel="nofollow" class="external text" href="//blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/">Kotlin on Android. Now official</a>. May 17, 2017 <span class="reference-accessdate"> [<span class="nowrap">2017-05-18</span>]</span>. (原始内容<a rel="nofollow" class="external text" href="//web.archive.org/web/20210131070003/https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/">存档</a>于2021-01-31). <q>Today, at the Google I/O keynote, the Android team announced first-class support for Kotlin.</q></cite></span></div></div></li>
<li id="cite_note-8"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-8" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-8" pcs-back-links="[&quot;#cite_ref-8&quot;]">[8]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="//kotlinlang.org/docs/reference/basic-syntax.html#defining-variables">Basic Syntax</a>. Kotlin. Jetbrains. <span class="reference-accessdate"> [<span class="nowrap">19 January</span> 2018]</span>. (原始内容<a rel="nofollow" class="external text" href="//web.archive.org/web/20210129183205/https://kotlinlang.org/docs/reference/basic-syntax.html#defining-variables">存档</a>于2021-01-29).</cite></span></div></div></li>
<li id="cite_note-9"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-9" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-9" pcs-back-links="[&quot;#cite_ref-9&quot;]">[9]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="//github.com/Kotlin/anko">Anko Github</a>. <span class="reference-accessdate"> [<span class="nowrap">2018-06-02</span>]</span>. (原始内容<a rel="nofollow" class="external text" href="//web.archive.org/web/20201213112926/https://github.com/Kotlin/anko/">存档</a>于2020-12-13).</cite></span></div></div></li>
<li id="cite_note-10"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-10" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-10" pcs-back-links="[&quot;#cite_ref-10&quot;]">[10]</a></div><div class="pcs-ref-body"><span class="reference-text"><a rel="nofollow" class="external text" href="//github.com/Kotlin/anko/blob/master/GOODBYE.md">anko/GOODBYE.md</a></span></div></div></li>
<li id="cite_note-11"><div class="pcs-ref"><div class="pcs-ref-backlink-container"><a id="back_link_cite_note-11" class="pcs-ref-back-link" href="./Kotlin#pcs-ref-back-link-cite_note-11" pcs-back-links="[&quot;#cite_ref-11&quot;]">[11]</a></div><div class="pcs-ref-body"><span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="//kotlinlang.org/docs/reference/lambdas.html">Higher-Order Functions and Lambdas</a>. Kotlin. Jetbrains. <span class="reference-accessdate"> [<span class="nowrap">19 January</span> 2018]</span>. (原始内容<a rel="nofollow" class="external text" href="//web.archive.org/web/20210122222128/https://kotlinlang.org/docs/reference/lambdas.html">存档</a>于2021-01-22).</cite></span></div></div></li>
</ol></div></div></div></div></section><section data-mw-section-id="21" style="display: none;"><div class="pcs-edit-section-header v2 pcs-section-hideable-header" onclick="pcs.c1.Sections.setHidden('21', false);"><span id="pcs-section-control-21" class="pcs-section-control pcs-section-control-show" role="button" aria-labelledby="pcs-section-aria-expand"><span id="pcs-section-aria-expand" aria-label="展开章节"></span><span id="pcs-section-aria-collapse" aria-label="折叠章节"></span></span><h2 id="外部連結" class="pcs-edit-section-title">外部連結</h2><span class="pcs-edit-section-link-container"><span id="pcs-edit-section-aria-normal" aria-label="编辑章节"></span><span id="pcs-edit-section-aria-protected" aria-label="编辑在保护页面的章节"></span><a href="/w/index.php?title=Kotlin&amp;action=edit&amp;section=21" data-id="21" data-action="edit_section" aria-labelledby="pcs-edit-section-aria-normal" class="pcs-edit-section-link"></a></span></div>
<div id="pcs-section-content-21" class="pcs-section-hidden"><ul><li><span class="new">Template:Official website</span></li>
<li><a rel="nofollow" class="external text" href="http://try.kotlinlang.org">官方範例</a> <a rel="nofollow" class="external text" href="//web.archive.org/web/20201203211351/http://try.kotlinlang.org/">页面存档备份</a>,存于<span class="new">互联网档案馆</span></li>
<li><a rel="nofollow" class="external text" href="//www.kotlincn.net">官方網站 - 中文翻譯</a> <a rel="nofollow" class="external text" href="//web.archive.org/web/20201027094529/https://www.kotlincn.net/">页面存档备份</a>,存于<span class="new">互联网档案馆</span></li>
<li><a rel="nofollow" class="external text" href="http://www.tw511.com/2/24/880.html">Kotlin教學</a> <a rel="nofollow" class="external text" href="//web.archive.org/web/20200608182609/http://www.tw511.com/2/24/880.html">页面存档备份</a>,存于<span class="new">互联网档案馆</span></li></ul><div style="clear: both; height: 1em"></div><p><span class="new">Template:程序设计语言</span>
</p></div></section><script defer="true">pcs.c1.Page.onBodyEnd();</script></div></body></html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment