IT评测·应用市场-qidao123.com技术社区

标题: 【Android】Kotlin教程(7) [打印本页]

作者: 诗林    时间: 2024-11-6 09:22
标题: 【Android】Kotlin教程(7)
总结:Kotin这门语言是谁计划的,语法很辣鸡,纯属是为了造门语言而造语言。

  
1.函数式编程

Kotlin 是一种当代的多范式编程语言,支持面向对象编程(OOP)和函数式编程(FP)。函数式编程是一种编程范式,它强调利用纯函数、不可变数据和高阶函数来构建程序。Kotlin 提供了许多特性来支持函数式编程风格,这些特性使得代码更加简洁、易读和易于测试。
2.变换函数map

map变换函数会遍历担当者聚集,让变换器函数作用于聚集里的各个元素,返回结果是包含已修改元素的聚集,会作为链上下一个函数的输入。
map变换函数和定义的变换器函数做完事变后,返回的是一个新聚集,原始聚集没有被修改。
  1. fun main() {
  2.     val animals = listOf("zebra", "giraffe", "elephant", "rat")
  3.     val babies = animals.map { animal -> "A baby $animal is so cute" }
  4.     println(babies)
  5.     // [A baby zebra is so cute, A baby giraffe is so cute, A baby elephant is so cute, A baby rat is so cute]
  6. }
复制代码
可以将多个 map 操纵链接在一起,以实现更复杂的转换。
  1. val numbers = listOf(1, 2, 3, 4, 5)
  2. val result = numbers.map { it * it }  // 计算平方
  3.     .map { "Square of $it" }  // 转换为描述性字符串
  4. println(result)  // 输出: [Square of 1, Square of 4, Square of 9, Square of 16, Square of 25]
复制代码
3.flatMap

flatMap函数操纵一个聚集的聚集,将其中多个聚会合的元素合并后返回一个包含所有元素的单一聚集。
  1.     val result = listOf(listOf(1, 2, 3), listOf(4, 5, 6), listOf(7, 8, 9))
  2.     val flatMap = result.flatMap { it }
  3.     println(flatMap)
  4.     // [1, 2, 3, 4, 5, 6, 7, 8, 9]
复制代码
4.过滤函数filter

filter 函数是一个非常有用的高阶函数,用于从聚会合筛选出满意特定条件的元素。它返回一个新的聚集,其中只包含那些通过给定谓词(predicate)测试的元素。filter 函数是函数式编程中的一个根本工具,可以资助你以一种简洁和声明式的方式处理数据。
  1. fun main() {
  2.     val list = listOf(1,2,3,4,5,6,7,8,9,10)
  3.     val result = list.filter { it % 2 == 0 }
  4.     println(result) // [2, 4, 6, 8, 10]
  5. }
复制代码
  1. fun isEven(number: Int): Boolean {
  2.     return number % 2 == 0
  3. }
  4. val numbers = listOf(1, 2, 3, 4, 5, 6)
  5. val evenNumbers = numbers.filter(::isEven)
  6. println(evenNumbers)  // 输出: [2, 4, 6]
复制代码
5.合并函数zip

zip 函数用于将两个聚集(如列表)中的元素配对,天生一个新的列表。每个新列表的元素是一个包含两个原聚集对应位置元素的 Pair。假如两个聚集的长度不同,那么结果列表的长度将与较短的那个聚集相同。
  1. fun main() {
  2.     val numbers1 = listOf(1, 2, 3)
  3.     val numbers2 = listOf(4, 5, 6)
  4.     val zipped1 = numbers1.zip(numbers2)
  5.     println(zipped1)  // 输出: [(1, 4), (2, 5), (3, 6)]
  6.     val names = listOf("Alice", "Bob", "Charlie")
  7.     val ages = listOf(30, 25, 35)
  8.     val zipped2 = names.zip(ages)
  9.     println(zipped2)  // 输出: [(Alice, 30), (Bob, 25), (Charlie, 35)]
  10. }
复制代码
6.合并函数fold

fold 函数是一个非常强大的高阶函数,用于对聚会合的元素进行累积操纵。它从一个初始值开始,依次应用一个函数到每个元素上,并将结果累积起来。fold 是一种减少(reduce)操纵,常用于盘算总和、乘积、最大值、最小值等。
  1. fun main() {
  2.     val numbers1 = listOf(1, 2, 3, 4, 5)
  3.     val sum1 = numbers1.fold(0) { acc, i -> acc + i }
  4.     println(sum1)  // 输出: 15
  5.     val numbers2 = listOf(1, 2, 3, 4, 5)
  6.     val product = numbers2.fold(1) { acc, i -> acc * i }
  7.     println(product)  // 输出: 120
  8. }
复制代码
7.序列

在Kotlin中,序列(Sequence)是一个强大的工具,用于处理大数据集或进行复杂的数据转换。
定义:序列是Kotlin标准库中的一个接口,表示一个元素序列。与普通的聚集不同,序列的操纵是惰性的,即元素不会在创建序列时立即被处理,而是会在序列被遍历或消费时才按需天生。这种延迟实行的方式允许我们编写出更高效的数据处理逻辑。
序列的操纵:

  1. // 扩展函数 Int.isPrime(),用于判断一个整数是否是质数
  2. fun Int.isPrime(): Boolean {
  3.     // 遍历从 2 到当前整数减 1 的所有整数
  4.     (2 until this).forEach {
  5.         // 如果当前整数能被任何一个遍历到的整数整除,则返回 false,表示不是质数
  6.         if (this % it == 0) {
  7.             return false
  8.         }
  9.     }
  10.     // 如果没有找到任何能整除当前整数的数,则返回 true,表示是质数
  11.     return true
  12. }
  13. fun main() {
  14.     // 1-5000之内 可以找到1000个素数
  15.     val toList = (1..5000).toList().filter { it.isPrime() }.take(1000)
  16.     println(toList.size) // 670
  17.     val sequence = generateSequence(2) { value -> value + 1 }.filter { it.isPrime() }.take(1000)
  18.     println(sequence.toList().size) // 1000
  19. }
复制代码
通过利用 Sequence,你可以高效地处理大量数据或无限序列,而不必要一次性加载所有数据到内存中。这对于性能敏感的应用程序非常有用。
8.互操纵性与可空性

互操纵性是指不同系统、软件或编程语言之间能够无缝协作的能力。对于 Kotlin 来说,这意味着 Kotlin 代码可以轻松地与用其他语言(如 Java)编写的代码一起工作。
  1. public class Jhava {
  2.    
  3.     @NotNull
  4.     public String getHello() {
  5.         return "Hello World";
  6.     }
  7.     @Nullable
  8.     public String determineFriendShipLevel(){
  9.         return null;
  10.     }
  11. }
复制代码
  1. fun main() {
  2.     val adversary = Jhava()
  3.     println(adversary.hello)
  4.     val level = adversary.determineFriendShipLevel()
  5.     println(level?.toLowerCase())
  6. }
复制代码
9.类型映射

代码运行时,所有的映射类型都会重新映射回对应的Java类型。
  1.     println(adversary.hitPoints.javaClass) // int
复制代码
10.属性访问

不必要调用相干的setter方法,可以利用赋值语句来设置一个Java字段值。
11.@JvmName

@JvmName 是 Kotlin 提供的一个注解,用于在天生的 Java 字节码中指定方法或属性的具体名称。这在你必要控制 Kotlin 代码天生的 Java 方法名时非常有用,特别是在与 Java 代码互操纵的情况下。
  1.     public static void main(String[] args) {
  2.         System.out.println(Hero.makeProclamation());
  3.     }
复制代码
  1. @file:JvmName("Hero")fun main() {    val adversary = Jhava()    println(adversary.hello)    val level = adversary.determineFriendShipLevel()    println(level?.toLowerCase())    println(adversary.hitPoints.javaClass) // int
  2. }fun makeProclamation() = "Greeting,beast!"
复制代码
12.@JvmField

@JvmField 是 Kotlin 提供的一个注解,用于在天生的 Java 字节码中直接暴露一个属性为字段(field),而不是通过 getter 和 setter 方法。这在你必要与 Java 代码进行互操纵时特别有用,因为它允许 Java 代码直接访问 Kotlin 属性,就像访问普通字段一样。
  1. class Spellbook {
  2.     @JvmField
  3.     val spells = listOf("Magic Ms. L","Lay on hans")
  4. }
复制代码
  1.     public static void main(String[] args) {
  2.         Spellbook spellbook = new Spellbook();
  3.         for (String spell : spellbook.spells){
  4.             System.out.println(spell);
  5.         }
  6.     }
复制代码
13.@JvmOverloads

@JvmOverloads 是 Kotlin 提供的一个注解,用于天生具有默认参数值的方法的多个重载版本。在 Java 中,方法不支持默认参数,因此 Kotlin 会为每个大概的参数组合天生一个单独的方法。这使得 Kotlin 的默认参数功能可以与 Java 代码无缝集成。
  1. @JvmOverloads
  2. fun handOverFood(leftHand : String = "berrriea", rightHand : String = "beef"){
  3.     println("$leftHand and $rightHand")
  4. }
复制代码
14.@JvmStatic

1.单例模式:
当你实现单例模式时,可以利用 @JvmStatic 来提供一个静态的方法来获取单例实例。
  1. object Singleton {
  2.     @JvmStatic
  3.     fun getInstance(): Singleton = this
  4. }
  5. // Java 代码
  6. public class Main {
  7.     public static void main(String[] args) {
  8.         Singleton singleton = Singleton.getInstance();
  9.         // 使用 singleton
  10.     }
  11. }
复制代码
2.工具类
在工具类中,你可以利用 @JvmStatic 来定义静态方法,这样 Java 代码可以直接调用这些方法而不必要创建类的实例。
  1. object StringUtils {
  2.     @JvmStatic
  3.     fun isNullOrEmpty(str: String?): Boolean {
  4.         return str == null || str.isEmpty()
  5.     }
  6.     @JvmStatic
  7.     fun reverse(str: String): String {
  8.         return str.reversed()
  9.     }
  10. }
复制代码
  1. // Java 代码
  2. public class Main {
  3.     public static void main(String[] args) {
  4.         boolean isEmpty = StringUtils.isNullOrEmpty("test");
  5.         String reversed = StringUtils.reverse("hello");
  6.         // 使用结果
  7.     }
  8. }
复制代码
3.伴生对象
在 Kotlin 中,伴生对象(companion object)中的成员默认不是静态的。利用 @JvmStatic 可以使这些成员在 Java 中表现为静态成员。
  1. class Spellbook {
  2.     @JvmField
  3.     val spells = listOf("Magic Ms. L","Lay on hans")
  4.     companion object {
  5.         @JvmStatic
  6.         val MAX_SPELL_COUNT = 10
  7.         fun getSpellbookGreeting() = println("I am the Great Grimoire!")
  8.     }
  9. }
复制代码
  1. System.out.println(Spellbook.getMAX_SPELL_COUNT());
  2. Spellbook.Companion.getSpellbookGreeting();
复制代码
4.枚举类
  1. enum class Color(val rgb: Int) {
  2.     RED(0xFF0000),
  3.     GREEN(0x00FF00),
  4.     BLUE(0x0000FF);
  5.     companion object {
  6.         @JvmStatic
  7.         fun fromInt(rgb: Int): Color? {
  8.             for (color in values()) {
  9.                 if (color.rgb == rgb) {
  10.                     return color
  11.                 }
  12.             }
  13.             return null
  14.         }
  15.     }
  16. }
复制代码
  1. // Java 代码
  2. public class Main {
  3.     public static void main(String[] args) {
  4.         Color color = Color.fromInt(0xFF0000);
  5.         // 使用 color
  6.     }
  7. }
复制代码
13.@Throws

@Throws 是 Kotlin 中的一个注解,用于声明一个函数大概会抛出哪些受检非常(checked exceptions)。在 Java 中,受检非常必须在方法签名中声明,而在 Kotlin 中,由于语言计划的原因,默认情况下不必要声明受检非常。然而,在某些情况下,特别是当你的 Kotlin 代码必要与 Java 代码互操纵时,利用 @Throws 注解可以明确地指出一个函数大概抛出的非常类型。
  1. import java.io.File
  2. import java.io.IOException
  3. fun readFile(filePath: String): String {
  4.     val file = File(filePath)
  5.     return file.readText()
  6. }
复制代码
在这个例子中,readText() 方法大概会抛出 IOException。为了明确这一点,你可以利用 @Throws 注解:
  1. import java.io.File
  2. import java.io.IOException
  3. @Throws(IOException::class)
  4. fun readFile(filePath: String): String {
  5.     val file = File(filePath)
  6.     return file.readText()
  7. }
复制代码
假如你盼望这个函数能够在 Java 代码中被调用,而且 Java 代码能够捕获 IOException,那么利用 @Throws 是必要的:
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         try {
  4.             String content = ExampleKt.readFile("path/to/file.txt");
  5.             System.out.println(content);
  6.         } catch (IOException e) {
  7.             e.printStackTrace();
  8.         }
  9.     }
  10. }
复制代码
注意:

  1. @Throws(IOException::class, FileNotFoundException::class)
  2. fun readFile(filePath: String): String {
  3.     // 实现
  4. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4