Kotlin中功能操作與集合(KAD 11)

来源:http://www.cnblogs.com/figozhg/archive/2017/02/04/6365704.html
-Advertisement-
Play Games

作者:Antonio Leiva 時間:Feb 2, 2017 原文鏈接:https://antonioleiva.com/functional-operations-collections-kotlin/ 對於我來說,我必須承認用Java代碼處理列表是最令人沮喪的事之一。 在這方面,雖然Java ...


作者:Antonio Leiva

時間:Feb 2, 2017

原文鏈接:https://antonioleiva.com/functional-operations-collections-kotlin/

 

 

對於我來說,我必須承認用Java代碼處理列表是最令人沮喪的事之一。

 

在這方面,雖然Java 8利用數據流(Stream)已經有了一些提升,但是如我們早前看到的我們怎樣利用高階函數壓縮代碼那樣,Kotlin語法極大地簡化這個過程。

 

Kotlin中集合的功能操作

 

雖然我不向你展示所有已有的操作(有很多),但是我要向你展示其中一部分,你能夠用它們做一些有趣的事。

 

如果你需要更完整的列表,你能夠在我之前寫的這篇文章中找到。

 

最有意思的是這些:

 

forEach

 

用forEach,你能夠簡單迭代集合每個元素:

1 viewGroup.children.forEach { v -> v.visibility = VISIBLE }

 

記住,用it,這還可以轉換為:

1 viewGroup.children.forEach { it.visibility = VISIBLE }

 

在Android中,沒有viewGroup.children,但是在前面的文章“怎樣獲得擴展屬性”中已見過。

 

map

 

這個操作把列表中的每個對象映射的新的列表,之後進行一些轉換。回到前面ViewGroup的例子:

1 val childViews = (0..viewGroup.childCount - 1).map { viewGroup.getChildAt(it) }

 

在這種情況下,map操作映射一集合的整數範圍(先前已經討論過範圍)到ViewGroup子視圖對應的新視圖集合中。

 

在後續文章,我們將說明在同一個代碼塊中怎樣避免冗餘的多次引用ViewGroup。

 

filter

 

如其名稱所示,filter允許我們依據特定條件過濾集合的元素。

 

例如,我們要過濾的ViewGroup子視圖依次為ViewGroup:

1 val childViews = viewGroup.children.filter { it is ViewGroup }

 

對於這個特殊情況,我們實際可以用filterIsinstance:

1 val childViews = viewGroup.children.filterIsInstance<ViewGroup>()

 

有幾種過濾類型,如filterNotNull,它捨棄null項;或filterNot,保留指定條件之外的項。

 

first / last

 

與前一項有關,它們返回列表滿足一定條件的第一個,或最後一個元素:

1 val firstTextView = viewGroup.children.first { it is TextView }
2 val lastTextView = viewGroup.children.last { it is TextView }

 

如果它們沒有找到任何滿足條件的元素,這些函數將拋出異常。在這種情況下,可以用替代方法firstOrNull,它會返回null。

 

sort

 

在Java中,排序元素總有點頭疼,且代碼的可讀性很差。但是,用Kotlin,我們可以以任意條件排序,這就容易多了。

 

儘管這個例子可能沒有多大意義,但是我可以依據可視性來排序ViewGroup子視圖。在視圖類中,可視性域是一整數,所以可以非常清晰知道一個視圖比另一個大或是小:

1 val firstTextView = viewGroup.children.sortedBy { it.visibility }

 

操作組合

 

當然,所有這些操作能夠按照我們的要求進行組合,用這種方法,我們可以用少量代碼完成十分複雜的操作:

1  (0..viewGroup.childCount - 1)
2                 .map { viewGroup.getChildAt(it) }
3                 .filterIsInstance()
4                 .sortedBy { it.visibility }
5                 .takeWhile { it.visibility < View.GONE }

 

例如,這裡ViewGroup中的所有ViewGroup視圖被恢復,依據可視性排序,標記出那些可視性低於GONE(即Visible和INVISIBLE)。

 

這不僅僅功能非常強大,而且比你用Java 6編寫同樣的功能更易於閱讀。

 

結論

 

在Kotlin中,對於集合的操作使我們節省大量代碼行,獲得更好的表達性和可讀性。

 

這幫助我們減少編寫錯誤的代碼。非常棒!

 

如果你要繼續學習Kotlin,你能夠獲得免費指南,學習怎樣建立你的第一個項目,或獲取這本書,學習怎樣從撓頭到創建一個複雜的APP。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 微信公眾平臺有4類賬號:訂閱號、服務號、企業號及小程式。訂閱號和服務號統稱為公眾號。 訂閱號的註冊主體可以為個人,但現在已關閉個人認證。服務號的註冊主體不能為個人。 在介面許可權方面,服務號比訂閱號多支持以下介面:模板消息(業務通知)、獲取用戶地理位置、生成帶參數的二維碼、長鏈接轉短鏈接介面、語義理解... ...
  • git詳解 git是從android出現,就作為版本管理工具。由於很多人從svn開始使用,簡單的check in & check out操作,很難理解和適應通過命令行操作的git的管理。 所以很多人繼續使用圖形界面的git管理工具,尤其android studio自帶git的圖形操作界面,使得很多人 ...
  • Activity Activity 本文內容 創建 Activity 實現用戶界面 在清單文件中聲明 Activity 啟動 Activity 啟動 Activity 以獲得結果 結束 Activity 管理 Activity 生命周期 實現生命周期回調 保存 Activity 狀態 處理配置變更 ...
  • 示例代碼: view.setTag(R.string.action_settings,hodler.content); 接收兩個值,一個是key值,必須是唯一值,而且要寫在values/string.xml 裡面,例如 <resources> <item type ="id" name = "fff ...
  • 英文原文:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion 作者:Ian Lake,Google Android 推廣工程師;翻譯:南韓愷。 當你發佈一個應用之後,(取決於具體的發佈時間)可能沒過幾個月 Andro ...
  • 安卓常用數據存儲方式之一SQLite學習及操作筆記 0.視頻地址:http://www.imooc.com/video/3382 1.每個程式都有自己的資料庫 預設情況下是各自互不幹擾 1)創建一個資料庫並且打開; 2)使用游標cursor相當於存儲結果的集合,可理解為list; 3)結束後必須釋放 ...
  • 基本結構圖(重要) Director: 有那些作用? OpenGL ES的初始化,場景的轉換,游戲暫停繼續的控制,世界坐標和GL坐標之間的切換,對節點(游戲元素)的控制,游戲數據的保存調用,屏幕尺寸的獲取 控制場景的常用方法 runWithScene( Scene *scene ) 啟動游戲,並運行 ...
  • activity_home.xml home_list_item.xml style.xml color.xml HomeActivity.java 知識點: GirdView + BaseAdapter+點擊事件 自定義TextView ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...