当前位置:网站首页>Application of kotlin - higher order function
Application of kotlin - higher order function
2022-07-02 08:35:00 【I can still size it.】
Higher order functions are very suitable for simplifying various functions API Call to , some API The original usage of is simplified by using higher-order functions , Whether in terms of ease of use or readability , May be greatly improved .
simplify SharedPreferences Usage of
The most primitive direction I learned before SharedPreferences The code for storing data in is as follows :
// obtain SharedPreferences.Editor object
val editor = getSharedPreferences("data",Context.MODE_PRIVATE).edit()
editor.putString("name","ZLS") // add to String Type data
editor.putInt("age",18)
editor.putBoolean("married",false)
editor.apply() // Submit data
But in the extension library indicated by the red arrow , Added his simplified usage 
It contains a code similar to the following , Can greatly facilitate SharedPreferences Use
fun SharedPreferences.edit(block: SharedPreferences.Editor.() -> Unit){
val editor = edit()
editor.block()
editor.apply()
}
Extend the function to SharedPreferences Class added a edit function , And it also receives a function type parameter , therefore edit Function is naturally a higher-order function . because edit Owned in function SharedPreferences The context of , Therefore, it can be called directly here edit() Method to get SharedPreferences.Editor object . in addition edit The function receives a SharedPreferences.Editor Function type parameters for , So we need to call editor.block() Calling a function type parameter , We can add data to the specific implementation of function type parameters . Finally, call editor.apply() Method to submit data , So as to complete the data storage operation .
The simplified code is as follows :
getSharedPreferences("data",Context.MODE_PRIVATE).edit{
putString("name","ZLS")
putInt("age",18)
putBoolean("married",false)
}
simplify ContentValues Usage of
ContentValues Mainly used for combination SQLiteDatabase Of API Storing and modifying data in a database , Specific basic usage, such as Next :
val values = ContentValues()
values.put("name", "Game of Thrones")
values.put("author", "George Martin")
values.put("pages", 720)
values.put("price", 20.85)
db.insert("Book", null, values)
The following describes how to make it simple by creating a new method :
First new ⼀ individual ContentValues.kt file , And then define a cvOf() Method :
fun cvOf(vararg pairs: Pair<String, Any?>): ContentValues {
}
The purpose of this method is to build a ContentValues object .
First ,cvOf() Method receives a Pair Parameters , That is to use A to B Parameter type created by syntax structure , But a parameter is added in front of it vararg keyword , It corresponds to Java Variable parameter list in , Allow passing... To this method 0 individual 、1 individual 、2 One or even any number Pair Parameters of type , These parameters are assigned to use vararg Above this variable declared , And then use for-in Loop can traverse all the parameters passed in .
Let's look at the statement Pair type . because Pair Is a data structure of key value pairs , Therefore, you need to specify the type of data corresponding to its key and value through generics .ContentValues All keys of are string type , Here you can put Pair The generic type of the key is specified as String. but ContentValues There can be many types of values ( String type 、 integer 、 floating-point , Even null), So we need to Pair The generic type of the value is specified as Any?. This is because Any yes Kotlin Common base class for all classes in , amount to Java Medium Object, and Any? It means that null values are allowed to be passed in .
fun cvOf(vararg pairs: Pair<String, Any?>): ContentValues {
val cv = ContentValues()
for (pair in pairs) {
val key = pair.first
val value = pair.second
when (value) {
is Int -> cv.put(key, value)
is Long -> cv.put(key, value)
is Short -> cv.put(key, value)
is Float -> cv.put(key, value)
is Double -> cv.put(key, value)
is Boolean -> cv.put(key, value)
is String -> cv.put(key, value)
is Byte -> cv.put(key, value)
is ByteArray -> cv.put(key, value)
null -> cv.putNull(key)
}
}
return cv
}
when Statement entry Int After conditional branch , Under this condition value Will be automatically converted to Int type , Instead of Any? type , So you don't need to be like Java In that way, another downward transformation , This function is if The same applies in the statement .
With this cvOf() After method , Use ContentValues It becomes easier when , For example, you can insert a piece of data into the database and write :
val values = cvOf("name" to "Game of Thrones", "author" to "George Martin", "pages" to 720, "price" to 20.85)
db.insert("Book", null, values)
Besides , You can also use apply Function for secondary optimization
fun cvOf(vararg pairs: Pair<String, Any?>) = ContentValues().apply {
for (pair in pairs) {
val key = pair.first
val value = pair.second
when (value) {
is Int -> put(key, value)
is Long -> put(key, value)
is Short -> put(key, value)
is Float -> put(key, value)
is Double -> put(key, value)
is Boolean -> put(key, value)
is String -> put(key, value)
is Byte -> put(key, value)
is ByteArray -> put(key, value)
null -> putNull(key)
}
}
}
As mentioned above KTX A library with the same function is also provided in the library contentValuesOf() Method , Usage is as follows :
val values = contentValuesOf("name" to "Game of Thrones", "author" to "George Martin", "pages" to 720, "price" to 20.85)
db.insert("Book", null, values)
Usually when writing code , Use it directly KTX Provided contentValuesOf() The method is ok .
边栏推荐
- One of the reasons for WCF update service reference error
- Carla-UE4Editor导入RoadRunner地图文件(保姆级教程)
- 链表经典面试题(反转链表,中间节点,倒数第k个节点,合并分割链表,删除重复节点)
- HCIA—数据链路层
- The source code of the live app. When the verification method is mailbox verification, the verification code is automatically sent to the entered mailbox
- Deep understanding of JVM
- Web security -- Logical ultra vires
- Honeypot attack and defense drill landing application scheme
- Li Kou daily one question brushing summary: binary tree chapter (continuous update)
- Programming ape learning English - imperative programming
猜你喜欢

Use Wireshark to grab TCP three handshakes

sqli-labs第8关(布尔盲注)

CarSim problem failed to start solver: path_ ID_ OBJ(X) was set to Y; no corresponding value of XXXXX?

IP protocol and IP address

Intelligent manufacturing solutions digital twin smart factory

OpenFeign 简单使用

CarSim learning experience - rough translation 1

TCP/IP—传输层

HCIA - data link layer

Sentinel easy to use
随机推荐
Chrome debugging
How to uninstall SQL Server cleanly
Use Matplotlib to draw a preliminary chart
Live broadcast platform development, flexible menu, and freely adjust the horizontal size of the menu bar
C language implements XML generation and parsing library (XML extension)
St-link connection error invalid ROM table of STM32 difficult and miscellaneous diseases
方法递归(斐波那契数列,青蛙跳台阶,汉诺塔问题)
Learn to write article format
cve_ 2019_ 0708_ bluekeep_ Rce vulnerability recurrence
W10 is upgraded to W11 system, but the screen is black, but the mouse and desktop shortcuts can be used. How to solve it
Global and Chinese market of wire loop, 2022-2028: Research Report on technology, participants, trends, market size and share
What are the platforms for selling green label domain names? What is the green label domain name like?
Sentinel easy to use
Web安全--核心防御机制
Opencv3 6.3 reduced pixel sampling with filters
路由基础—动态路由
Sqli labs Level 2
Animation synchronization of CarSim real-time simulation
HCIA—应用层
Sqli labs level 1