Kotlin基础 7

1.apply函数详解

1.1. DSL

Kotlin 复制代码
/**
 * 为什么要传入扩展函数(泛型),而不是一个普通的匿名函数
 * T.()->Unit
 * 扩展函数里自带了接收者对象的this隐式调用
 * 为什么是泛型的扩展函数?
 * 因为是由this 隐式调用 this 类型就是泛型类型, 相当于this的扩展函数,就把this的作用域放进去了.
 *
 * 匿名函数,也可以是扩展函数
 *
 *
 */

2.函数式编程

3.变换函数

3.1 map函数

Kotlin 复制代码
fun main() {
    val animals:List<String> = listOf("zebra", "giraffe", "elephant", "rat")

    val map:List<String> = animals.map { animals -> "A baby $animals" } //相当于stream流 map 然后自动collectList
    println(animals)//不会改变原来的集合
    println(map)
}

3.2 flapMap

Kotlin 复制代码
fun main() {

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

}

3.3 filter

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

3.4 合并函数

zip

Kotlin 复制代码
fun main() {

    val employees = listOf("Jack", "Rose", "Jason")
    val shirtSize = listOf("red", "green", "yellow")
    val map:Map<String,String> = employees.zip(shirtSize).toMap()
    println(map)
}

fold

Kotlin 复制代码
fun main() {

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


}

4.序列

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

Kotlin 复制代码
fun Int.isPrime():Boolean{
    ( 2 until this).map {
        if (this % it == 0){
            return false
        }
    }
    return true
}

fun main() {


    //假定0-5000之内,可以找到1000个素数
    val toList = (1..5000).toList().filter { it.isPrime() }.take(1000)//take 拿去前1000个
    println(toList)

    //就是不知道有多少个可变的序列
    val oneTousandPrimes = generateSequence(2) { v ->
        v + 1
    }.filter { it.isPrime() }.take(1000)
    println(oneTousandPrimes.toList().size)

}

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

java 复制代码
package javahuixang

fun main() {
    val adversary = Jhava()
    val determineGreeting = adversary.determineGreeting()
    //String! 平台类型  有可能会有空指针 ,需要处理一下
    println(determineGreeting?.toLowerCase())
}
java 复制代码
package javahuixang;

public class Jhava {
    public String utterGreeting(){
        return "Hello";
    }

    public String determineGreeting(){
        return null;
    }





}

6.类型映射

Kotlin 复制代码
package javahuixang;

public class Jhava {

    public int hitPoints = 3322;
    public String utterGreeting(){
        return "Hello";
    }

    public String determineGreeting(){
        return null;
    }





}
Kotlin 复制代码
package javahuixang

fun main() {
    val jhava = Jhava()
    println(jhava.hitPoints.javaClass)
}

7.属性访问

Kotlin 复制代码
package javahuixang

fun main() {
    val jhava = Jhava()
    println(jhava.hitPoints)
}
java 复制代码
package javahuixang;

public class Jhava {

    private int hitPoints = 3322;
    public String utterGreeting(){
        return "Hello";
    }

    public String determineGreeting(){
        return null;
    }

    public int getHitPoints() {
        System.out.println("get");
        return hitPoints;
    }

    public void setHitPoints(int hitPoints) {
        this.hitPoints = hitPoints;
    }
}

8.Java调用kotlin

Kotlin 复制代码
package javahuixang

fun main() {
    val adversary = Jhava()
    val determineGreeting = adversary.determineGreeting()
    //String! 平台类型  有可能会有空指针 ,需要处理一下
    println(determineGreeting?.toLowerCase())
}


fun makeProclamation() = "Greetings,beast!"
java 复制代码
   public static void main(String[] args) {
        String s = HeroKt.makeProclamation();
        System.out.println(s);
    }

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

Kotlin 复制代码
@file:JvmName("Hero")
package javahuixang
fun main() {
    val adversary = Jhava()
    val determineGreeting = adversary.determineGreeting()
    //String! 平台类型  有可能会有空指针 ,需要处理一下
    println(determineGreeting?.toLowerCase())
}


fun makeProclamation() = "Greetings,beast!"
java 复制代码
 public static void main(String[] args) {
        String s = Hero.makeProclamation();
        System.out.println(s);
    }

10.@JvmField

Kotlin 复制代码
package javahuixang

class Spellbook{
    @JvmField
    val spells = listOf("a","b")
   
}
java 复制代码
  public static void main(String[] args) {
        Spellbook spellbook = new Spellbook();//加了  @JvmField 自动调用 kotlin的get方法 ,给Java提供了Kotlin的语法
        List<String> spells = spellbook.spells;
    }

11.@JvmOverload

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

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

12. @JvmStatic

Kotlin 复制代码
package javahuixang

class Spellbook{
    @JvmField
    val spells = listOf("a","b")

    companion object{
        @JvmField
        val MX=10
        @JvmStatic
        fun getSpellGreeting() = println("i am a good")
    }

}
java 复制代码
    public static void main(String[] args) {
        //Java要支持 用默认值 得重载
//        Spellbook.Companion.getMX();
        System.out.println(Spellbook.MX);
        //让JAVA支持kotlin的写法
        Spellbook.getSpellGreeting();
    }

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

13.Throws

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

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

Kotlin 复制代码
@kotlin.jvm.Throws(IOException::class)
fun acceptApology() {
    throw IOException()
}

Java

java 复制代码
  try {
            Hero.acceptApology();
        } catch (IOException e) {
            System.out.println("catch");
        }

14.函数类型操作

Java调用kotlin 匿名函数

Kotlin 复制代码
val translator= {utterance:String ->
    println(utterance.toLowerCase().capitalize())
}
java 复制代码
    public static void main(String[] args) {

        Function1<String, Unit> translator = Hero.getTranslator();

         translator.invoke("TRUCE");


    }
相关推荐
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
孙启超2 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust