麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

分分鐘學會Kotlin語言(Learn kotlin in Y Minutes)

2024-07-21 23:03:36
字體:
來源:轉載
供稿:網友
谷歌宣布kotlin成安卓開發一級語言以后,kotlin大熱,Kotlin是JVM上的靜態類型的編程語言,它是100%兼容的java。

廢話少說,上代碼,由于代碼太長,分兩段:

  1. //這是單行注釋 // 
  2. /* 
  3. 這是多行注釋 
  4. */ 
  5. // 這和Java的 "package" 差不多. 
  6. package com.learnxinyminutes.kotlin 
  7.  
  8. /* 
  9. Kotlin程序入口函數是名為"main". 
  10. 這個函數的入參是包含命令行參數的數組 
  11. */ 
  12. fun main(args: Array<String>) { 
  13.     /* 
  14.     聲明值是使用"var" 或 "val". 
  15.     "val"是一旦分配值后就不能變,不變量,相反"vars" 是聲明變量 
  16.     */ 
  17.     val fooVal = 10 // 之后就不能再給fooVal分配其他值了 
  18.     var fooVar = 10 
  19.     fooVar = 20 // fooVar是變量,能夠再次分配值 
  20.  
  21.     /* 
  22.     大多數情況, Kotlin能夠決定一個變量的類型是什么。 
  23.     這樣我們不必顯式明確每次去指定變量類型了。 
  24.     我們可以通過如下方式明確定義變量類型: 
  25.     */ 
  26.     val foo : Int = 7 
  27.  
  28.     /* 
  29.     Kotlin包含兩種類型的字符串:與Java字符串相同的escaped strings和新的raw strings, 
  30.     escaped strings中的換行符是/n字符串和Java中一樣定義, 
  31.     反斜杠是換行符 
  32.     */ 
  33.     val fooString = "My String Is Here!" 
  34.     val barString = "Printing on a new line?/nNo Problem!" 
  35.     val bazString = "Do you want to add a tab?/tNo Problem!" 
  36.     println(fooString) 
  37.     println(barString) 
  38.     println(bazString) 
  39.  
  40.     /* 
  41.     行字符串(raw strings)由三個引號分隔 ("""). 
  42.     顧名思義能包含新的一行和其他任何字符。 
  43.    下面是給fooRawString賦值的是一個函數helloWorld,直至第四行的三個引號才表示賦值結束 
  44.     */ 
  45.     val fooRawString = ""
  46. fun helloWorld(val name : String) { 
  47.    println("Hello, world!"
  48. ""
  49.     println(fooRawString) 
  50.  
  51.     /* 
  52.     字符串能保護模板表達式 
  53.     模板表達式是以美元符號開始($). 
  54.     */ 
  55.     val fooTemplateString = "$fooString has ${fooString.length} characters" 
  56.     println(fooTemplateString) 
  57.  
  58.     /* 
  59.     對于一個變量是空必須明確指定其是nullable. 
  60.     變量可以在其類型后面追加問號?指定其是nullable, 
  61.     然后使用?.操作符訪問這個nullable的變量 
  62.     也可以使用?: 操作符在其為null時為其分配一種值。 
  63.     */ 
  64.     var fooNullable: String? = "abc" 
  65.     println(fooNullable?.length) // => 3 
  66.     println(fooNullable?.length ?: -1) // => 3 
  67.     fooNullable = null 
  68.     println(fooNullable?.length) // => null 
  69.     println(fooNullable?.length ?: -1) // => -1 
  70.  
  71.     /* 
  72.     函數是使用"fun" 定義 
  73.     函數參數在函數名后面的括號中指定。函數參數可以有默認值。如果需要,函數返回類型在參數之后指定。 
  74.     */ 
  75.     fun hello(name: String = "world"): String { 
  76.         return "Hello, $name!" 
  77.     } 
  78.     println(hello("foo")) // => Hello, foo! 
  79.     println(hello(name = "bar")) // => Hello, bar! 
  80.     println(hello()) // => Hello, world! 
  81.  
  82.     /* 
  83.     一個函數參數可以使用"vararg" 標注, 
  84.     能夠讓許多參數傳遞進入函數。 
  85.     */ 
  86.     fun varargExample(vararg names: Int) { 
  87.         println("Argument has ${names.size} elements"
  88.     } 
  89.     varargExample() // => Argument has 0 elements 
  90.     varargExample(1) // => Argument has 1 elements 
  91.     varargExample(1, 2, 3) // => Argument has 3 elements 
  92.  
  93.     /* 
  94.     當一個函數由單個表達式組成時,那么這個卷括號可以被省略。函數內容體是在等于號=之后指定。 
  95.     */ 
  96.     fun odd(x: Int): Boolean = x % 2 == 1 
  97.     println(odd(6)) // => false 
  98.     println(odd(7)) // => true 
  99.  
  100.     // 如果返回類型能被推斷,我們就不必指定了。 
  101.     fun even(x: Int) = x % 2 == 0 
  102.     println(even(6)) // => true 
  103.     println(even(7)) // => false 
  104.  
  105.     // 函數能用函數作為參數,返回頁首函數。 
  106.     fun not(f: (Int) -> Boolean): (Int) -> Boolean { 
  107.         return {n -> !f.invoke(n)} 
  108.     } 
  109.     // Named函數能使用 :: 作為參數指定. 
  110.     val notOdd = not(::odd) 
  111.     val notEven = not(::even) 
  112.     // Lambda 表達式能指定為參數 
  113.     val notZero = not {n -> n == 0} 
  114.     /* 
  115.     如果一個lambda僅有一個參數,它的聲明可以被忽視(隨著 ->一起). 
  116.     單個參數名將是"it". 
  117.     */ 
  118.     val notPositive = not {it > 0} 
  119.     for (i in 0..4) { 
  120.         println("${notOdd(i)} ${notEven(i)} ${notZero(i)} ${notPositive(i)}"
  121.     } 
  122.  
  123.     //  "class" 是用來聲明類 
  124.     class ExampleClass(val x: Int) { 
  125.         fun memberFunction(y: Int): Int { 
  126.             return x + y 
  127.         } 
  128.  
  129.         infix fun infixMemberFunction(y: Int): Int { 
  130.             return x * y 
  131.         } 
  132.     } 
  133.     /* 
  134.     創建新的實例使用構造器 
  135.     Kotlin沒有 "new"  
  136.     */ 
  137.     val fooExampleClass = ExampleClass(7) 
  138.     // 成員函數能使用點符號調用 
  139.     println(fooExampleClass.memberFunction(4)) // => 11 
  140.  
  141.     /* 
  142.     如果一個函數被"infix"標注,能使用infix notation調用 
  143.     下面fooExampleClass infixMemberFunction 4等同于 
  144. fooExampleClass.memberFunction(4) 
  145.     */ 
  146.     println(fooExampleClass infixMemberFunction 4) // => 28 
  147.  
  148.     /* 
  149.    數據類是創建只包含數據的精確方式. 
  150.      "hashCode"/"equals" 和 "toString" 等方法會自動產生。 
  151.     */ 
  152.     data class DataClassExample (val x: Int, val y: Int, val z: Int) 
  153.     val fooData = DataClassExample(1, 2, 4) 
  154.     println(fooData) // => DataClassExample(x=1, y=2, z=4) 
  155.  
  156.     // 數據類沒有 "copy" 函數 
  157.     val fooCopy = fooData.copy(y = 100) 
  158.     println(fooCopy) // => DataClassExample(x=1, y=100, z=4) 
  159.  
  160.     // 對象能被解構入多個變量。 
  161.     val (a, b, c) = fooCopy 
  162.     println("$a $b $c"// => 1 100 4 
  163.  
  164.     // 解構 "for" 循環 
  165.     for ((a, b, c) in listOf(fooData)) { 
  166.         println("$a $b $c"// => 1 100 4 
  167.     } 
  168.  
  169.     val mapData = mapOf("a" to 1, "b" to 2) 
  170.     // Map.Entry 也能解構 
  171.     for ((key, value) in mapData) { 
  172.         println("$key -> $value"
  173.     } 
  174.  
  175.     //  "with" 函數類似JavaScript "with" 語句. 
  176.     data class MutableDataClassExample (var x: Int, var y: Int, var z: Int) 
  177.     val fooMutableData = MutableDataClassExample(7, 4, 9) 
  178.     with (fooMutableData) { 
  179.         x -= 2 
  180.         y += 2 
  181.         z-- 
  182.     } 
  183.     println(fooMutableData) // => MutableDataClassExample(x=5, y=6, z=8) 
  184.  
  185.     /* 
  186.     使用 "listOf" 函數創建集合 
  187.     集合是不可變的,元素不能增加和移走 
  188.     */ 
  189.     val fooList = listOf("a""b""c"
  190.     println(fooList.size) // => 3 
  191.     println(fooList.first()) // => a 
  192.     println(fooList.last()) // => c 
  193.     // list元素可通過索引訪問。 
  194.     println(fooList[1]) // => b 
  195.  
  196.     // 一個可變的 list能使用 "mutableListOf" 函數創建 
  197.     val fooMutableList = mutableListOf("a""b""c"
  198.     fooMutableList.add("d"
  199.     println(fooMutableList.last()) // => d 
  200.     println(fooMutableList.size) // => 4 
  201.  
  202.     // 使用 "setOf"  創建set 
  203.     val fooSet = setOf("a""b""c"
  204.     println(fooSet.contains("a")) // => true 
  205.     println(fooSet.contains("z")) // => false 
  206.  
  207.     // 使用 "mapOf" f創建map 
  208.     val fooMap = mapOf("a" to 8, "b" to 7, "c" to 9) 
  209.     // Map values can be accessed by their key. 
  210.     println(fooMap["a"]) // => 8 
  211.  
  212.      //待續 
  213. /* 
  214.     使用 "generateSequence" f函數創建序列號,它是懶賦值的集合,只有使用時才真正賦值。 
  215.     */ 
  216.     val fooSequence = generateSequence(1, { it + 1 }) 
  217.     val x = fooSequence.take(10).toList() 
  218.     println(x) // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
  219.  
  220.     // 產生 斐波納契案例 
  221.     fun fibonacciSequence(): Sequence<Long> { 
  222.         var a = 0L 
  223.         var b = 1L 
  224.  
  225.         fun next(): Long { 
  226.             val result = a + b 
  227.             a = b 
  228.             b = result 
  229.             return a 
  230.         } 
  231.  
  232.         return generateSequence(::next) 
  233.     } 
  234.     val y = fibonacciSequence().take(10).toList() 
  235.     println(y) // => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] 
  236.  
  237.     // Kotlin提供colletion的高階函數。 
  238.     val z = (1..9).map {it * 3} 
  239.                   .filter {it < 20} 
  240.                   .groupBy {it % 2 == 0} 
  241.                   .mapKeys {if (it.key) "even" else "odd"
  242.     println(z) // => {odd=[3, 9, 15], even=[6, 12, 18]} 
  243.  
  244.     // "for" 循環 
  245.     for (c in "hello") { 
  246.         println(c) 
  247.     } 
  248.  
  249.     // "while" 循環是和其他語言一樣 
  250.     var ctr = 0 
  251.     while (ctr < 5) { 
  252.         println(ctr) 
  253.         ctr++ 
  254.     } 
  255.     do { 
  256.         println(ctr) 
  257.         ctr++ 
  258.     } while (ctr < 10) 
  259.  
  260.     /* 
  261.     "if" 能表達返回一個值的表達式 
  262.     */ 
  263.     val num = 5 
  264.     val message = if (num % 2 == 0) "even" else "odd" 
  265.     println("$num is $message"// => 5 is odd 
  266.  
  267.     // "when" 能作為"if-else if" 替換 
  268.     val i = 10 
  269.     when { 
  270.         i < 7 -> println("first block"
  271.         fooString.startsWith("hello") -> println("second block"
  272.         else -> println("else block"
  273.     } 
  274.  
  275.     // "when" 能帶一個參數 
  276.     when (i) { 
  277.         0, 21 -> println("0 or 21"
  278.         in 1..20 -> println("in the range 1 to 20"
  279.         else -> println("none of the above"
  280.     } 
  281.  
  282.     // "when" 能用在返回一個值的函數can be used as a function that returns a value. 
  283.     var result = when (i) { 
  284.         0, 21 -> "0 or 21" 
  285.         in 1..20 -> "in the range 1 to 20" 
  286.         else -> "none of the above" 
  287.     } 
  288.     println(result) 
  289.  
  290.     /* 
  291.     使用"is" 操作符檢查類型,如果一個對象傳入類型檢查,就無需再次明確casting 它了 
  292.     */ 
  293.     fun smartCastExample(x: Any) : Boolean { 
  294.         if (x is Boolean) { 
  295.             // x is automatically cast to Boolean 
  296.             return x 
  297.         } else if (x is Int) { 
  298.             // x is automatically cast to Int 
  299.             return x > 0 
  300.         } else if (x is String) { 
  301.             // x is automatically cast to String 
  302.             return x.isNotEmpty() 
  303.         } else { 
  304.             return false 
  305.         } 
  306.     } 
  307.     println(smartCastExample("Hello, world!")) // => true 
  308.     println(smartCastExample("")) // => false 
  309.     println(smartCastExample(5)) // => true 
  310.     println(smartCastExample(0)) // => false 
  311.     println(smartCastExample(true)) // => true 
  312.  
  313.     // Smartcast also works with when block 
  314.     fun smartCastWhenExample(x: Any) = when (x) { 
  315.         is Boolean -> x 
  316.         is Int -> x > 0 
  317.         is String -> x.isNotEmpty() 
  318.         else -> false 
  319.     } 
  320.  
  321.     /* 
  322.     Extensions是一個增加新函數到類的方式,類似 C# extension 方法 
  323.     */ 
  324.     fun String.remove(c: Char): String { 
  325.         return this.filter {it != c} 
  326.     } 
  327.     println("Hello, world!".remove('l')) // => Heo, word! 
  328.  
  329.     println(EnumExample.A) // => A 
  330.     println(ObjectExample.hello()) // => hello 
  331.  
  332. // Enum類似Java enum類型 
  333. enum class EnumExample { 
  334.     A, B, C 
  335.  
  336. /* 
  337. "object"能被用于創建單例對象,不能初始化它,但是能使用名稱引向它。類似 Scala singleton objects. 
  338. */ 
  339. object ObjectExample { 
  340.     fun hello(): String { 
  341.         return "hello" 
  342.     } 
  343.  
  344. fun useObject() { 
  345.     ObjectExample.hello() 
  346.     val someRef: Any = ObjectExample // we use objects name just as is 


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: www深夜成人 | 国产一级毛片视频在线! | 国产在线精品一区二区三区不卡 | 91精品国产91久久久 | 色呦呦一区二区三区 | 中国成人在线视频 | www.777含羞草 | 欧美日韩国产成人在线 | 日本欧美一区 | 国产一区二区三区四区在线 | 亚洲综合色视频在线观看 | 久久精品欧美一区二区三区不卡 | 国产亚洲精品综合一区91555 | 羞羞视频.www在线观看 | 精品久久久久久久久久久久包黑料 | 91成人免费网站 | 真人一级毛片免费 | 成人9禁啪啪无遮挡免费 | 国产精品美女一区二区 | 久久免费视频精品 | 精品国产九九九 | 看国产毛片| 成人午夜激情视频 | 依依成人精品视频 | 亚洲精品tv久久久久久久久久 | 久久免费视频5 | 久久精品欧美视频 | 中国美女一级黄色大片 | 成人在线观看地址 | 国产毛片毛片毛片 | 久久久一区二区三区四区 | 27xxoo无遮挡动态视频 | 欧美精品1区| 91久久国产露脸精品国产 | 99久久精品免费 | 欧美特级一级毛片 | 九九热精品视频在线免费观看 | 91成人影库 | 国产毛毛片一区二区三区四区 | av电影在线观看网址 | 久久手机在线视频 |