成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大部分業務代碼,都在處理數據!所以,高效很重要!!

開發 開發工具
在日常編寫業務代碼的時候,大部分代碼其實就是在處理數據、展示數據,這些操作占用了我們大量的編碼時間。

 [[260740]]

一、序

在日常編寫業務代碼的時候,大部分代碼其實就是在處理數據、展示數據,這些操作占用了我們大量的編碼時間。

比較常見的,從某個集合中找到滿足某個限制條件的數據。最簡單的方法就是利用循環來遍歷數據集合,找到我們需要的數據。

  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 

大部分數據集合的操作,我們都可以通過循環來解決,針對一些更復雜的操作,例如從兩個集合中找出交集集合,可以通過兩層嵌套循環解決。

除了用粗暴的循環解決問題之外,我們還可以利用 Kotlin 對集合封裝的一些高階函數,讓我們對集合的處理,更得心應手。

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

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

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

本文就從業務場景出發,講解 Kotlin 中與集合相關的一些高階函數的使用和場景。

二、集合的高階函數

Kotlin 原生就支持 Lambda 表達式,高階函數中都可以基于 Lambda 來實現的。

假如我們需要實現一個公司內部的員工管理系統,那我們首先定義一個員工類(EmployeModel)。

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

接下來我們就圍繞這個員工類,實現各種必要的需求。

2.1 數據篩選

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

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

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

.filter() 方法內不是其實也是用 for 循環來實現的,沒有什么高深的。而除了filter() 之外,Kotlin 還提供了帶上一些特殊條件的過濾器。

例如:

  • filterIndexed,帶 Index 的過濾器。
  • filterNot,過濾所有不滿足條件的數據。

這里就不展開了。

2.2 數據排序

需求:將給定的員工列表,根據員工的薪酬進行排序。

通過 sortedBy() 方法,指定排序依據,它會根據指定的數值,進行自然順序排序。

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

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

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

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

2.3 集合切片

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

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

  1. var findList = list.take(100) 

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

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

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

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

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

2.4 集合變換

需求:要調薪了,準備將一批員工漲薪 20%。那就需要批量上報一批員工信息,和服務端商量,只需要上報這一批調薪的員工 ID 即可。

原本我們有一個員工類的集合 List list,但是這個集合里都是一個個員工的對象。在上報之前,我們需要將他們轉換成 List

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

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

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

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

2.5 數據分組

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

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

  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"); 

此時需求又變了,要根據部門來分組,公司的部門可不止兩個。針對這種情況,可以通過 groupBy() 方法進行分組。

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

groupBy() 方法會返回一個 Map

2.6 其他操作

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

高階函數之所以強大,更多的是因為支持鏈式調用,我們可以通過一個很清晰代碼結構,就實現我們對集合的復雜需求。

我拍腦袋舉個例子,取員工集合里,A 部門的員工,根據員工 ID 排序后,取前 100 號員工的 ID 進行上報。

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

這樣一個復雜的集合操作,在 Kotlin 的高階函數中,只需要一組鏈式調用即可實現。

另外需要注意的是,高階函數中很多方法,都不是線程安全的,所以在使用的時候,需要考慮多線程場景下的同步問題。

三、小結時刻

本文介紹了一些比較常用的集合操作函數,隨著 Kotlin 版本的升級,還有會更多的高階函數添加進來,更多細節可以閱讀源碼或者參考 kotlin.collections 文檔。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

 

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

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2016-10-26 10:23:42

2018-08-31 07:33:58

2010-11-18 12:44:25

LibreOffice

2015-08-04 09:56:48

2019-06-12 10:35:49

程序員高效工具開源

2014-09-16 11:31:44

移動應用數據安全個人隱私

2016-12-12 18:45:08

Data Mining大數據

2018-09-17 15:09:28

區塊鏈去中心化互聯網

2018-11-25 21:53:10

人工智能AI開發者

2013-09-16 15:00:15

2021-08-06 17:44:45

云安全云計算網絡安全

2011-11-09 09:59:21

云計算IT管理

2021-04-06 15:20:05

編程語言JavaIT

2020-02-06 13:43:35

微軟WindowsWindows 10

2010-08-19 10:47:59

諾基亞Ovi永久免費

2025-01-26 16:04:09

2009-05-07 10:09:40

微軟裁員招聘

2011-04-06 16:41:29

網段

2011-05-04 16:55:42

2012-11-23 22:47:36

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人午夜免费网站 | 最新中文字幕在线 | wwwxxx国产| 男人天堂视频在线观看 | 成人性视频在线播放 | 久久伊人操 | 国产一级视频在线观看 | 香蕉视频久久久 | 91精品国产自产在线老师啪 | 男人的天堂久久 | 国产一级片一区二区三区 | 操射视频 | 中文字幕视频在线 | 中文字幕不卡在线观看 | 日本久久久一区二区三区 | 97在线观视频免费观看 | 国产精品视频导航 | 狠狠婷婷综合久久久久久妖精 | av国产精品| 国产视频一区在线观看 | 黄色视频a级毛片 | 国产一区二区三区在线 | 亚洲欧美日韩网站 | 在线观看av网站永久 | 91视频国产一区 | 亚洲一区二区在线免费观看 | 成人一区二区三区在线 | 91精品国产一区二区在线观看 | 欧美三级电影在线播放 | 久久国产高清 | 久久尤物免费一区二区三区 | 亚洲国产精品久久久久 | 91精品一区二区 | 欧美激情精品久久久久久变态 | 日韩视频一区二区 | 亚洲网在线 | 一区二区三区在线免费 | 在线视频 中文字幕 | 亚洲精品粉嫩美女一区 | 亚洲欧美日韩中文在线 | 97精品超碰一区二区三区 |