一捷凄、集合的創(chuàng)建和遍歷
? ? 一般的集合主要就是List、Set和Map。List的主要實(shí)現(xiàn)類是ArrayList和LinkedList贸桶,Set的主要實(shí)現(xiàn)類是HashSet,Map的主要實(shí)現(xiàn)類是HashMap
1桌肴、集合的創(chuàng)建
? ? val list = listOf("apple", "orange", "pear")
? ? ? ? 不過(guò)listOf()函數(shù)創(chuàng)建的是一個(gè)不可變集合皇筛,創(chuàng)建可變集合用mutableListOf()函數(shù)。
? ? val map = mapOf("apple" to 1, "orange" to 2, "pear" to 3)
2坠七、集合的函數(shù)式API
? ? 如果要在水果集合里找到單詞最長(zhǎng)的那個(gè)水果水醋,可以用如下代碼:
? ? val maxLengthFruit = list.maxBy{it.length};
? ? 上述表達(dá)式使用了Lambda表達(dá)式的語(yǔ)法結(jié)構(gòu),只需一行代碼就可以實(shí)現(xiàn)該功能彪置。
3拄踪、Lambda的語(yǔ)法結(jié)構(gòu):
? ? {參數(shù)名1: 參數(shù)類型,????參數(shù)名2: 參數(shù)類型? ? -> 函數(shù)體}? ??
? ? 最外層是一對(duì)大括號(hào)。如有參數(shù)傳入Lambda表達(dá)式拳魁,需要聲明參數(shù)列表惶桐;參數(shù)列表結(jié)尾用->表示參數(shù)列表的結(jié)束以及函數(shù)體的開(kāi)始。在函數(shù)體中的猛,可以編寫任意行代碼耀盗,并且最后一行代碼會(huì)自動(dòng)作為返回值。
? ? 當(dāng)然卦尊,Lambda表達(dá)式更多的是簡(jiǎn)化寫法叛拷,以上述表達(dá)式為例:
? ? ? ? val lambda = {fruit : String -> fruit.length};
? ? ? ? val maxLengthFruit = list.maxBy(lambda);
? ? ? ? 等價(jià)于 val maxLengthFruit = list.maxBy({fruit : String -> fruit.length});
? ? Kotlin規(guī)定:如果Lambda表達(dá)式是函數(shù)的最后一個(gè)參數(shù)時(shí),可將Lambda表達(dá)式移到函數(shù)括號(hào)外面:
? ? ? ? val maxLengthFruit = list.maxBy() {fruit : String -> fruit.length};
? ? 如果Lambda表達(dá)式是函數(shù)的唯一一個(gè)參數(shù)岂却,可以省略括號(hào):
? ? ? ? val maxLengthFruit = list.maxBy{fruit : String -> fruit.length};
? ? 因?yàn)镵otlin有類型推導(dǎo)機(jī)制忿薇,所以大多數(shù)情況下,Lambda表達(dá)式中的參數(shù)列表可以不必聲明參數(shù)類型:
? ? ? ? val maxLengthFruit = list.maxBy{fruit -> fruit.length};
? ? 最后躏哩,當(dāng)Lambda表達(dá)式的參數(shù)列表只有一個(gè)參數(shù)時(shí)署浩,可不聲明參數(shù)名,直接用it關(guān)鍵字代替:
? ? ? ? val maxLengthFruit = list.maxBy{it.length};
4扫尺、Stream
? ? ? ? 1)什么是Stream:Stream是一個(gè)來(lái)自數(shù)據(jù)源的元素隊(duì)列筋栋,并支持聚合操作
? ? ? ? ? ? ? ? 數(shù)據(jù)源:流的來(lái)源≌ぃ可以是集合弊攘、數(shù)組、IO姑曙、產(chǎn)生器generator等
? ? ? ? ? ? ? ? 聚合操作:類似SQL語(yǔ)句一樣的操作襟交。比如filter、map伤靠、reduce捣域、find、match、sorted等
? ? ? ? 2)生成流:
? ? ? ? ? ? ? ? stream():為集合創(chuàng)建串行流
? ? ? ? ? ? ? ? parallelStream():為集合創(chuàng)建并行流
? ? ? ? 3)forEach():迭代流中的每個(gè)數(shù)據(jù)
? ? ? ? ? ? ? ? new Random().ints().limit(10).forEach(System.out::pringln());
? ? ? ? 4)filter():通過(guò)設(shè)置過(guò)濾條件焕梅,過(guò)濾數(shù)據(jù)
? ? ? ? 5)limit():獲取指定數(shù)量的流
? ? ? ? 6)sorted():對(duì)流進(jìn)行排序
? ? ? ? 7)Collectors:實(shí)現(xiàn)了很多歸約操作迹鹅,例如將流轉(zhuǎn)換成集合和聚合元素。Collectors可用于返回列表或字符串
? ? ? ? ? ? ? ? list.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
? ? ? ? ? ? ? ? list.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
? ? ? ? 8)統(tǒng)計(jì):另外丘侠,一些統(tǒng)計(jì)結(jié)果也非常有用徒欣。它們主要用于int逐样、double蜗字、long等基本類型上。
? ? ? ? ? ? ? ? IntSummaryStatistics stats = numbers.stream().mapToInt(x -> x).summaryStatistics();
? ? ? ? ? ? ? ? stats.getMax();? ? stats.getMin();? ? stats.getSum();? ? stats.getAverage();