• Kotlin基础 7


    1.apply函数详解  

    1.1. DSL

    1. /**
    2. * 为什么要传入扩展函数(泛型),而不是一个普通的匿名函数
    3. * T.()->Unit
    4. * 扩展函数里自带了接收者对象的this隐式调用
    5. * 为什么是泛型的扩展函数?
    6. * 因为是由this 隐式调用 this 类型就是泛型类型, 相当于this的扩展函数,就把this的作用域放进去了.
    7. *
    8. * 匿名函数,也可以是扩展函数
    9. *
    10. *
    11. */

    2.函数式编程

     3.变换函数

    3.1 map函数

     

    1. fun main() {
    2. val animals:List = listOf("zebra", "giraffe", "elephant", "rat")
    3. val map:List = animals.map { animals -> "A baby $animals" } //相当于stream流 map 然后自动collectList
    4. println(animals)//不会改变原来的集合
    5. println(map)
    6. }

     3.2 flapMap

    1. fun main() {
    2. val flatMap =
    3. listOf(listOf(1, 2, 3), listOf(4, 5, 6, 7, 8, 9)).flatMap { it -> it.map { it + 1 } } //flatMap是合并泛型里同类型的集合
    4. println(flatMap)
    5. }

    3.3 filter

    和Java一样,不需要过多重复

    3.4 合并函数

    zip

    1. fun main() {
    2. val employees = listOf("Jack", "Rose", "Jason")
    3. val shirtSize = listOf("red", "green", "yellow")
    4. val map:Map = employees.zip(shirtSize).toMap()
    5. println(map)
    6. }

    fold

     

    1. fun main() {
    2. //将每个元素乘以三叠加起来
    3. val fold = listOf(1, 2, 3, 4).fold(0) { acc, i ->
    4. println("acc = $acc")
    5. acc + (i * 3)
    6. }
    7. println("sum = $fold")
    8. }

    4.序列

    none 是 若有一个为 true 则为false ,全为false 则为true

    1. fun Int.isPrime():Boolean{
    2. ( 2 until this).map {
    3. if (this % it == 0){
    4. return false
    5. }
    6. }
    7. return true
    8. }
    9. fun main() {
    10. //假定0-5000之内,可以找到1000个素数
    11. val toList = (1..5000).toList().filter { it.isPrime() }.take(1000)//take 拿去前1000个
    12. println(toList)
    13. //就是不知道有多少个可变的序列
    14. val oneTousandPrimes = generateSequence(2) { v ->
    15. v + 1
    16. }.filter { it.isPrime() }.take(1000)
    17. println(oneTousandPrimes.toList().size)
    18. }

     5. Java与Kotlin互操作性和可空性

    1. package javahuixang
    2. fun main() {
    3. val adversary = Jhava()
    4. val determineGreeting = adversary.determineGreeting()
    5. //String! 平台类型 有可能会有空指针 ,需要处理一下
    6. println(determineGreeting?.toLowerCase())
    7. }
    1. package javahuixang;
    2. public class Jhava {
    3. public String utterGreeting(){
    4. return "Hello";
    5. }
    6. public String determineGreeting(){
    7. return null;
    8. }
    9. }

    6.类型映射

    1. package javahuixang;
    2. public class Jhava {
    3. public int hitPoints = 3322;
    4. public String utterGreeting(){
    5. return "Hello";
    6. }
    7. public String determineGreeting(){
    8. return null;
    9. }
    10. }
    1. package javahuixang
    2. fun main() {
    3. val jhava = Jhava()
    4. println(jhava.hitPoints.javaClass)
    5. }

    7.属性访问

     

    1. package javahuixang
    2. fun main() {
    3. val jhava = Jhava()
    4. println(jhava.hitPoints)
    5. }
    1. package javahuixang;
    2. public class Jhava {
    3. private int hitPoints = 3322;
    4. public String utterGreeting(){
    5. return "Hello";
    6. }
    7. public String determineGreeting(){
    8. return null;
    9. }
    10. public int getHitPoints() {
    11. System.out.println("get");
    12. return hitPoints;
    13. }
    14. public void setHitPoints(int hitPoints) {
    15. this.hitPoints = hitPoints;
    16. }
    17. }

    8.Java调用kotlin

    1. package javahuixang
    2. fun main() {
    3. val adversary = Jhava()
    4. val determineGreeting = adversary.determineGreeting()
    5. //String! 平台类型 有可能会有空指针 ,需要处理一下
    6. println(determineGreeting?.toLowerCase())
    7. }
    8. fun makeProclamation() = "Greetings,beast!"
    1. public static void main(String[] args) {
    2. String s = HeroKt.makeProclamation();
    3. System.out.println(s);
    4. }

    9.@file:JvmName 给kotlin文件起别名

    1. @file:JvmName("Hero")
    2. package javahuixang
    3. fun main() {
    4. val adversary = Jhava()
    5. val determineGreeting = adversary.determineGreeting()
    6. //String! 平台类型 有可能会有空指针 ,需要处理一下
    7. println(determineGreeting?.toLowerCase())
    8. }
    9. fun makeProclamation() = "Greetings,beast!"
    1. public static void main(String[] args) {
    2. String s = Hero.makeProclamation();
    3. System.out.println(s);
    4. }

    10.@JvmField

    1. package javahuixang
    2. class Spellbook{
    3. @JvmField
    4. val spells = listOf("a","b")
    5. }
    1. public static void main(String[] args) {
    2. Spellbook spellbook = new Spellbook();//加了 @JvmField 自动调用 kotlin的get方法 ,给Java提供了Kotlin的语法
    3. List spells = spellbook.spells;
    4. }

    11.@JvmOverload

    1. @JvmOverloads
    2. fun handOverFood(leftHand:String="berries",rightHand:String = "beef"){
    3. println("Mmmm... you hand over some delicious $leftHand and $rightHand")
    4. }
    1. public static void main(String[] args) {
    2. //Java要支持 用默认值 得重载
    3. Hero.handOverFood();
    4. }

    kotlin最大的优势就是可以和Java互编

    12. @JvmStatic

    1. package javahuixang
    2. class Spellbook{
    3. @JvmField
    4. val spells = listOf("a","b")
    5. companion object{
    6. @JvmField
    7. val MX=10
    8. @JvmStatic
    9. fun getSpellGreeting() = println("i am a good")
    10. }
    11. }
    1. public static void main(String[] args) {
    2. //Java要支持 用默认值 得重载
    3. // Spellbook.Companion.getMX();
    4. System.out.println(Spellbook.MX);
    5. //让JAVA支持kotlin的写法
    6. Spellbook.getSpellGreeting();
    7. }

    类加载就加载出来的,在JVM加载不会有线程安全问题

    13.Throws

     Kotlin抛出的异常,让JAVA能够catch到

     想要Java 能够catch kotlin 抛出的异常,必须用 这个注解

    1. @kotlin.jvm.Throws(IOException::class)
    2. fun acceptApology() {
    3. throw IOException()
    4. }

    Java 

    1. try {
    2. Hero.acceptApology();
    3. } catch (IOException e) {
    4. System.out.println("catch");
    5. }

    14.函数类型操作

     Java调用kotlin 匿名函数

    1. val translator= {utterance:String ->
    2. println(utterance.toLowerCase().capitalize())
    3. }
    1. public static void main(String[] args) {
    2. Function1 translator = Hero.getTranslator();
    3. translator.invoke("TRUCE");
    4. }

  • 相关阅读:
    什么是低代码开发?低代码开发可以解决哪些问题?
    【算法-动态规划】零钱兑换问题-力扣 322
    虚拟化概述与虚拟化应用场景
    Golang 并发机制 CSP模型
    蓝牙电话之HFP—电话音频
    【AI应用】NVIDIA GeForce RTX 3060的详情参数
    十、非线性激活函数
    kubeneters 1.20 二进制方式高可用部署
    如何选一款软件助力企业腾飞
    如何做好文献阅读及笔记整理
  • 原文地址:https://blog.csdn.net/qq_53374893/article/details/136221324