偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

大部分業(yè)務(wù)代碼,都在處理數(shù)據(jù)!所以,高效很重要??!

開(kāi)發(fā) 開(kāi)發(fā)工具
在日常編寫(xiě)業(yè)務(wù)代碼的時(shí)候,大部分代碼其實(shí)就是在處理數(shù)據(jù)、展示數(shù)據(jù),這些操作占用了我們大量的編碼時(shí)間。

 [[260740]]

一、序

在日常編寫(xiě)業(yè)務(wù)代碼的時(shí)候,大部分代碼其實(shí)就是在處理數(shù)據(jù)、展示數(shù)據(jù),這些操作占用了我們大量的編碼時(shí)間。

比較常見(jiàn)的,從某個(gè)集合中找到滿(mǎn)足某個(gè)限制條件的數(shù)據(jù)。最簡(jiǎn)單的方法就是利用循環(huán)來(lái)遍歷數(shù)據(jù)集合,找到我們需要的數(shù)據(jù)。

  1. fun findFive() { 
  2.     val list = arrayListOf(1, 2, 3, 4, 5, 6, 7) 
  3.     val findList = mutableListOf<Int>() 
  4.     for (i in list) { 
  5.         if (i > 5) { 
  6.             findList.add(i) 
  7.         } 
  8.     } 
  9.     // findList 

大部分?jǐn)?shù)據(jù)集合的操作,我們都可以通過(guò)循環(huán)來(lái)解決,針對(duì)一些更復(fù)雜的操作,例如從兩個(gè)集合中找出交集集合,可以通過(guò)兩層嵌套循環(huán)解決。

除了用粗暴的循環(huán)解決問(wèn)題之外,我們還可以利用 Kotlin 對(duì)集合封裝的一些高階函數(shù),讓我們對(duì)集合的處理,更得心應(yīng)手。

上面例子中的需求,用 Kotlin 集合的高階函數(shù),一個(gè)方法就可以解決。

  1. val findList = list.filter { it > 5 } 

集合的高階函數(shù),還有很多更巧妙的使用方式。

本文就從業(yè)務(wù)場(chǎng)景出發(fā),講解 Kotlin 中與集合相關(guān)的一些高階函數(shù)的使用和場(chǎng)景。

二、集合的高階函數(shù)

Kotlin 原生就支持 Lambda 表達(dá)式,高階函數(shù)中都可以基于 Lambda 來(lái)實(shí)現(xiàn)的。

假如我們需要實(shí)現(xiàn)一個(gè)公司內(nèi)部的員工管理系統(tǒng),那我們首先定義一個(gè)員工類(lèi)(EmployeModel)。

  1. data class EmployeModel(var id: Long, // 員工 ID 
  2.                         var name: String,// 姓名 
  3.                         var age: Int,// 年齡 
  4.                         var department: String,// 部門(mén) 
  5.                         var salary: Int // 薪水 
  6. ) { 
  7.  
  8. // var list = arrayListOf(EmployeModel(...),...) 

接下來(lái)我們就圍繞這個(gè)員工類(lèi),實(shí)現(xiàn)各種必要的需求。

2.1 數(shù)據(jù)篩選

需求:從給定的員工列表中,篩選出月薪大于 2w 的所有員工。

正如前文中舉例的樣子,對(duì)于數(shù)據(jù)篩選,可以使用 .filter() 方法,此方法接受一個(gè) Boolean 類(lèi)型的條件,它會(huì)返回所有滿(mǎn)足此條件的數(shù)據(jù)集合,最終其實(shí)返回的依然是一個(gè) List。

  1. var findList = list.filter {it.salary > 20000} 

.filter() 方法內(nèi)不是其實(shí)也是用 for 循環(huán)來(lái)實(shí)現(xiàn)的,沒(méi)有什么高深的。而除了filter() 之外,Kotlin 還提供了帶上一些特殊條件的過(guò)濾器。

例如:

  • filterIndexed,帶 Index 的過(guò)濾器。
  • filterNot,過(guò)濾所有不滿(mǎn)足條件的數(shù)據(jù)。

這里就不展開(kāi)了。

2.2 數(shù)據(jù)排序

需求:將給定的員工列表,根據(jù)員工的薪酬進(jìn)行排序。

通過(guò) sortedBy() 方法,指定排序依據(jù),它會(huì)根據(jù)指定的數(shù)值,進(jìn)行自然順序排序。

  1. var findList = list.sortedBy{it.salary} 

sortedBy() 方法為順序排序,如果想要逆序排序,可以使用 sortedByDescending()方法。

需要注意的是,除了 sortedBy() 之外,配套的還有 sortBy() 和sortByDescending() 方法,這兩套方法的區(qū)別在于操作的集合以及返回值是什么。

在 Kotlin 中,所有的集合可以分為可變集合和不可變集合,sortBy/sortByDescending 方法,只能作用在可變集合上,它返回的是一個(gè) Unit 類(lèi)型的對(duì)象,會(huì)在集合上進(jìn)行自排序。而 sortBy() 方法會(huì)返回一個(gè)排序好的新集合。

2.3 集合切片

需求:將給定的員工列表,只顯示前 100 位員工。

如果想獲取某個(gè)集合中前 N 個(gè)員工,可以使用 take() 方法。

  1. var findList = list.take(100) 

和 take() 取前 N 個(gè)員工類(lèi)似,還可以使用 takeLast() 方法獲取末尾 N 個(gè)員工。

更靈活的切片,例如取第 10~20 的員工,就需要用到 slice() 方法,如果想要截取連續(xù)的一段數(shù)據(jù),可以使用 IntRange 類(lèi)來(lái)指定。

  1. var findList = list.slice(IntRange(10,20)) 

slice() 方法還支持直接指定集合的下標(biāo),來(lái)獲取不連續(xù)的數(shù)據(jù),例如選取排名第 1、10、25 位員工。

  1. var findList = list.slice(arrayListOf(1, 10, 15)) 

2.4 集合變換

需求:要調(diào)薪了,準(zhǔn)備將一批員工漲薪 20%。那就需要批量上報(bào)一批員工信息,和服務(wù)端商量,只需要上報(bào)這一批調(diào)薪的員工 ID 即可。

原本我們有一個(gè)員工類(lèi)的集合 List list,但是這個(gè)集合里都是一個(gè)個(gè)員工的對(duì)象。在上報(bào)之前,我們需要將他們轉(zhuǎn)換成 List

這里就可以用到 map() 方法,它可以對(duì)集合中的數(shù)據(jù)做一次變換。

  1. var findList = list.map { it.id } 

map() 原本是不帶 index 的,如果對(duì) index 有需求,可以使用 mapIndexed()方法。

map() 代表了一種一對(duì)一的變換關(guān)系。如果想做到一對(duì)多,可以使用 flatMap()方法,flatMap() 可以將每個(gè)元素變換為一個(gè)新的集合,再將其平鋪成一個(gè)集合。

2.5 數(shù)據(jù)分組

需求:將所有的員工,用年齡以 20 歲為界限進(jìn)行分組。

這種兩分的分組,可以使用 partition() 方法,它需要制定一個(gè)分組的條件,以 Boolean 類(lèi)型區(qū)分,最終返回一個(gè) Pair 對(duì)象,Pair.first 就是滿(mǎn)足條件的集合,Pair.second 則是不滿(mǎn)足條件的集合。

  1. var findList = list.partition { it.age > 20 } 
  2. findList.first.forEach{ 
  3.     Log.i("cxmyDev","${it.name} 大于 20"); 
  4. findList.second.forEach{ 
  5.     Log.i("cxmyDev","${it.name} 小于或等于 20"); 

此時(shí)需求又變了,要根據(jù)部門(mén)來(lái)分組,公司的部門(mén)可不止兩個(gè)。針對(duì)這種情況,可以通過(guò) groupBy() 方法進(jìn)行分組。

  1. var findList = list.groupBy { it.department } 

groupBy() 方法會(huì)返回一個(gè) Map

2.6 其他操作

前面介紹的這些針對(duì) Kotlin 集合的高階函數(shù),基本上滿(mǎn)足我對(duì)集合的大部分操作。當(dāng)然,Kotlin 還有一些更豐富的高階函數(shù),有興趣可以直接查看 _Collections.kt 源碼。

高階函數(shù)之所以強(qiáng)大,更多的是因?yàn)橹С宙準(zhǔn)秸{(diào)用,我們可以通過(guò)一個(gè)很清晰代碼結(jié)構(gòu),就實(shí)現(xiàn)我們對(duì)集合的復(fù)雜需求。

我拍腦袋舉個(gè)例子,取員工集合里,A 部門(mén)的員工,根據(jù)員工 ID 排序后,取前 100 號(hào)員工的 ID 進(jìn)行上報(bào)。

  1. var findList = list.filter { 
  2.     "A".equals(it.department) 
  3. }.sortedBy { 
  4.     it.id 
  5. }.map { 
  6.     it.id 
  7. }.take(100) 

這樣一個(gè)復(fù)雜的集合操作,在 Kotlin 的高階函數(shù)中,只需要一組鏈?zhǔn)秸{(diào)用即可實(shí)現(xiàn)。

另外需要注意的是,高階函數(shù)中很多方法,都不是線(xiàn)程安全的,所以在使用的時(shí)候,需要考慮多線(xiàn)程場(chǎng)景下的同步問(wèn)題。

三、小結(jié)時(shí)刻

本文介紹了一些比較常用的集合操作函數(shù),隨著 Kotlin 版本的升級(jí),還有會(huì)更多的高階函數(shù)添加進(jìn)來(lái),更多細(xì)節(jié)可以閱讀源碼或者參考 kotlin.collections 文檔。

【本文為51CTO專(zhuān)欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)聯(lián)系作者獲取授權(quán)】

 

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2016-10-26 10:23:42

2010-11-18 12:44:25

LibreOffice

2015-08-04 09:56:48

2018-08-31 07:33:58

2019-06-12 10:35:49

程序員高效工具開(kāi)源

2014-09-16 11:31:44

移動(dòng)應(yīng)用數(shù)據(jù)安全個(gè)人隱私

2016-12-12 18:45:08

Data Mining大數(shù)據(jù)

2018-09-17 15:09:28

區(qū)塊鏈去中心化互聯(lián)網(wǎng)

2018-11-25 21:53:10

人工智能AI開(kāi)發(fā)者

2011-11-09 09:59:21

云計(jì)算IT管理

2013-09-16 15:00:15

2020-02-06 13:43:35

微軟WindowsWindows 10

2010-08-19 10:47:59

諾基亞Ovi永久免費(fèi)

2025-01-26 16:04:09

2021-08-06 17:44:45

云安全云計(jì)算網(wǎng)絡(luò)安全

2021-04-06 15:20:05

編程語(yǔ)言JavaIT

2012-11-23 22:47:36

2011-05-04 16:55:42

2020-01-08 10:51:24

5G網(wǎng)絡(luò)安全通信

2009-05-07 10:09:40

微軟裁員招聘
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)