kotlin之閉包案例詳解

2022-10-03 16:03:17 字數 1316 閱讀 6762

閉包,函式式程式設計福音

先了解函式式程式設計(functional programming)

概念:它屬於「結構化程式設計」的一種,主要思想是把運算過程盡量寫成一系列巢狀的函式呼叫。函式式程式語言最重要的基礎是運算(lambda表示式),運算的函式可以接受函式當做引數或返回值。

對比函式式程式設計與物件導向程式設計

物件導向程式設計(object-oriented programming,縮寫oop)

物件導向程式設計是一種具有物件概念的程式程式設計范型,它可能包含資料、屬性、方法。它將物件作為程式的基本單元,將方法和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性。物件裡的程式可以訪問及經常修改物件相關聯的資料。在物件導向程式設計裡,電腦程式會被設計成彼此相關的物件。

1.程式的結構化

物件導向程式設計可以看作一種在程式中包含各種獨立而又互相呼叫的物件的思想,相比傳統的面向過程程式設計將程式看作一系列函式的集合這種無系統化和結構化的模式,物件導向程式設計將一系列關聯性的資料、方法結構化,封裝成類,通過類的物件進行方法、屬性呼叫的方式,可以讓程式設計者更加便於分析、設計和理解。

2.程式的靈活性和可維護性

物件導向程式設計由於整合、封裝、多型的特性,可以更好的設計出高內聚、低耦合的系統 結構,使得系統更靈活、更容易擴充套件,開發及維護成本更低。

執行速度更慢

由於所有的資料都是不可變的,所有的變數在程式執行期間都是一直存在的,非常占用執行資源。同時由於函式式的先天性設計導致效能一直不夠。雖然現代的汗水程式語言使用了很多技巧,比如惰性計算等優化執行速度,但始終無法與物件導向相比,當然比面向過程的程式就更慢了

了解完函式式程式設計,再回歸今天的主題——閉包

我們都知道,程式的變數分為全域性變數和區域性變數,全域性變數程式設計客棧,顧名思義,其作用域是當前檔案甚至檔案外的所有地方;而區域性變數,我們只能再其有限的作用域裡獲取。

那麼,如何在外部呼叫區域性變數呢?答案就是——閉包,與此給閉包下個定義:閉包就是能夠讀取其他函式內部變數的函式

首先看個簡單的例子

//這是乙個返回值為乙個函式的高階函式

fun makefun():()->unit

}fun main()

執行結果:

在比如乙個稍微複雜一點的例子,實現斐波那契數列

//斐波那契數列

fun fibonacci():()->long

weqval}

fun main()

測試執行:

使用迭代器實現斐波那契數列

//使用迭代器實現斐波那契數列(這裡就不是返回乙個函式而是乙個物件了)

fun fibonacci2():iterable}}

}fun main()

}執行結果:

閉包小案例

閉包可以用在許多地方。它的最大用處有兩個,乙個是可以讀取函式內部的變數,另乙個就是讓這些變數的值始終保持在記憶體中。閉包的應用涉及作用域 函式的引數傳遞 變數提公升等知識,當迴圈使用時,通過畫圖的方式可以更好的去理解。以下的這段 n 只有1級引用 function fun n,s var a fun...

javascript閉包詳解

下面先看乙個例子,在不執行的情況下推測一下返回結果.function t1 return t2 var temp t1 var age 99 temp 在學習了作用域之後也許會分析結果是99,實際上是20.下面對其一一分析 在大部分語言中,t1被呼叫執行,則申請記憶體並把其區域性變數push入棧。t...

Scala閉包詳解

閉包是乙個函式,返回值依賴於宣告在函式外部的乙個或多個變數。閉包通常來講可以簡單的認為是可以訪問乙個函式裡面區域性變數的另外乙個函式。如下面這段匿名的函式 val multiplier i int i 10函式體內有乙個變數 i,它作為函式的乙個引數。如下面的另一段 val multiplier i...