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");


    }
相关推荐
程序猿追4 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓4 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播4 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
墨云安全5 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠5 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y5 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
jack186896 小时前
安卓手机忘记锁屏密码怎么办? 无需密码也可解锁
android·智能手机
jimy16 小时前
c++的 Type Traits (一)
开发语言·c++
Web极客码7 小时前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python
kimnoic8 小时前
PHP 8.2的DNF类型怎么用才规范
开发语言·php