Kotlin Lambda和高阶函数

2023-10-31

Lambda和高阶函数

本文链接:

lambda

1、lambda的由来

  1. 单词"lambda"源于希腊字母λ(小写lambda)
  2. "Lambda"一词最早起源于数学中的λ演算(lambda calculus),它是一种函数定义和函数应用的形式系统,由逻辑学家阿隆佐·邱奇(Alonzo Church)在20世纪30年代发明。
  3. 邱奇使用λ作为演算中的一个操作符,用于表示匿名函数。他选择使用希腊字母λ的原因是因为它在字母表中的位置不太常见,这样可以避免与其他符号混淆。

2、函数的声明

    // 函数的声明
    val method01:()->Unit
    val method02:(Int, Int)->Unit
    val method03:(String, Double)->Any // 相当于Object
    val method04:(String, Double, Float)->Boolean

3、kotlin中Any和Java的Object有什么区别吗?

  1. Any是所有非空类型的超类型,类似于Java中的Object。Object不能持有null。
  2. Any?是所有类型的超类型,包括可空类型。
    Any?可以持有null值

4、函数如何调用/函数的实现(lambda)?invoke是什么?

// 函数变量通过invoke()调用
// ()是运算符重载
// 函数的实现
val method01:()->Unit
method01 = { println("我实现了method01") }
method01() // 调用函数:操作符重载
method01.invoke() // 调用函数:真实方法


// 方法三的实现
val method03:(String, Double)->Any // 相当于Object
method03 = {name, number ->
    println("$name $number")
    name + number
}
println(method03("wch", 1234567.89))

5、函数的实现(传入函数)

val method04:(String, Double, Float)->Boolean
    = fun(name:String, number:Double, age:Float):Boolean = (name+number+age).isEmpty()
method04("wch", 376.23, 1234.5f)

6、单一参数的lambda默认持有it ===> 函数式接口 ===> SAM

    val method05:(Int)->Unit = {
        print("$it")
    }

7、下划线可以拒收 ===> 拒收

    val method06:(Int, Int)->Unit = { _, number->
            println("$number")
    }

8、作用是什么?

  1. 节省空间
  2. 接口版本变化,有的参数没用了

9、想要允许参数为null,需要用可空类型如String?

val method07:(String?,String)->Unit = {
        sex, name -> println("$sex,$name")
    }

method07(null, "wch")

10、Lambda不可以使用泛型作为参数类型
11、Lambda参数不可以给默认值 ===> 默认参数
12、Lambda Any->Any

    // 传入什么,打印什么,还可以返回任何东西
    val method18:(Any)->Any={
        println("$it")
        it // 还可以返回自己
    }

13、Lambda配合扩展方法 ===> 扩展方法 ===> 官网写的Funciton,但是接收receiver

    val method19: String.()->Unit = {
        // this = String本身 == 调用者本身
        println("你是$this")
    }
    "WCH".method19()

14、为什么method19可以成为String的扩展方法?

  1. 代码val method19: String.()->Unit = { ... }表示定义了一个接收者类型为String的扩展函数类型。
  2. String.()->Unit表示该函数类型接收一个String作为接收者,并返回Unit类型(即没有返回值)。
  3. 进一步理解:==> 匿名扩展函数
val method18: ()->Unit; // 类型是 函数
val method19: String.()->Unit // 类型是 String的扩展函数
val method20: (String)->Unit // 类型是 函数,该函数的参数是String

15、进一步融合this和it,区分扩展函数 和 参数的区别

val method20: Int.(Int) -> String = {"两数相加的结果:${this+it}"}
println(1.method20(10))

println(method20(1, 10)) // 1, 可以自动插为第一个参数

函数的形式:

fun Int.method21(n:Int):String{
    return "两数相加的结果:${this+n}"
}
println(2.method21(22))
// println(method21(2, 22)) // 不可以这样写了

输出(返回类型)

1、Lambda的返回类型:函数

    /**============================
     * 函数
     *============================*/
    // 默认Unit
    fun t01(){ println() }
    // 默认Unit
    fun t02(){4652342.5f}
    // 默认Unit
    fun t03(){"Hello!"}
    // String:显式指明返回值
    fun t04():String{return "feather"} // return 还不支持自动推断类型

2、函数返回函数

    /**==============================
     * 函数返回函数
     *=============================*/
    // ()->Unit
    fun s01() = {}
    fun s02() = { println("Haha") }
    s02()() // 输出

    // Boolean
    fun s03() = run{ true }// 返回的是代码块的最后一行
    s03()
    // ()->String
    fun s04():()->String = {"Hello"}
    println(s04()) // Function0<java.lang.String>
    println(s04()())

3、Java中Lambda是假的

深入探究

4、Lambda深入探究

    // k01()返回的类型是: (Int)->Unit
    fun k01() = {n:Int -> println(n) }
    k01()(123)

    // lambda使用,第一种用的多
    val methodx2 = {str:String -> str.length}
    val methodx2s:(String)->Int = {it.length}

5、Kotlin的Lambda如何和Java兼容?源码机制

  1. kotlin编译器实现(很强大) -> JVM字节码
  2. package kotlin.jvm.functions中定义了Function系列
  3. 最多Funciton22,高版本编译器可以处理>22个参数的情况,低版本会出错
// val methodx2 = {str:String -> str.length}
Function1 methodx2 = (Function1)null.INSTANCE;
// (String)->Unit
val method3:Function1<String, Unit> = { println(it) }

6、Lambda考题

    //(Int,Int) -> (Int,Int) ->String
    val funX10 = fun(n1:Int,n2:Int):(Int,Int)->String={n1,n2 -> "两个数相加:${n1 + n2}"}
    println(funX10(10, 10)(20, 20))

    // 迷惑点,最外层的n1和n2和内层的n1 n2没关系
// 函数的函数的函数的函数
    val k01: (String) -> (Boolean) -> (Int) -> (Float) -> Double =
        { it ->
            { it ->
                { it ->
                    { it ->
                        123.456
                    }
                }
            }
        }
    println(k01("AAA")(true)(45)(67.89f))

7、下面的study02()返回的类型是什么?

fun study02() = {lambda:(Int, Int) -> String, studyInfo: String ->
    lambda(1, 99)
}
// 答案:((Int, Int) -> String, String) -> Unit 

// 使用:
study02()({n1, n2-> "$n1 + $n2 = ${n1 + n2}" }, "wch")

8、下面study04()返回的类型是什么?

fun study04() = {str:String, num:Int, lambda1:(String)->Unit, lambda2:(Int)->Boolean->
    lambda1(str)
    lambda2(num)
}
// 答案:(String,Int,(String)->Unit,(Int)->Unit)->Boolean

// 使用:
println(study04()("wch", 123, { println("$it lambda1") }, { it > 99}))

泛型

9、下面返回的类型是什么?

fun <T1, T2, R1, R2> study05() = {str:T1, num:T2, lambda1:(T1)->R1, lambda2:(T2)->R2 ->
    lambda1(str)
    lambda2(num)
}
// (T1, T2, (T1)->R1, (T2)->R2) -> R2

// 使用:
study05<String, Int, Boolean, Float>()("wch", 22, {it.isEmpty()}, {it.toFloat()})

10、下面的study06不是lambda,是函数。他们的类型是什么?

fun study05() = {Str:String, num: Int, lambda:(Int)->Boolean ->
    lambda(num)
}
// (String, Int, (Int)->Boolean)->Boolean

fun study06() = fun(Str:String, num: Int, lambda:(Int)->Boolean):Boolean{
    return lambda(num)
}
// (String, Int, (Int)->Boolean)->Boolean
  1. Lambda表达式,最后一行作为返回值
  2. 函数,最后一行不能作为返回值
  3. 必须显式return
  4. 必须显式指定

函数有隐式的Unit类型返回值

inline原理探究

1、Lambda为什么要内联?

  1. 不使用内联,会构造出Function0对象,作为参数传入
  2. 代码内联,减少方法调用开销,不再需要创建Function0对象 ===> 内存抖动
fun main() {
    show{
        println("Hello Kotlin!")
    }
}
fun show(lambda:()->Unit){
    lambda()
}
// 不使用内联生成代码:
show((Function0)null.INSTANCE);
public static final void show(@NotNull Function0 lambda) {
    Intrinsics.checkNotNullParameter(lambda, "lambda");
    lambda.invoke();
}
// 使用内联:
int $i$f$show = false;
int var1 = false;
String var2 = "Hello Kotlin!";
System.out.println(var2);

高阶函数

===> Compose内部实现,学习

1、高阶函数是什么?高阶函数 = lambda + 函数

fun a() {}
val a1 = {} // 函数引用,接收,匿名函数
val a2 = a1 // 函数引用
val a3 = ::a // 将函数变成函数引用

2、高阶函数就是函数的函数,函数中有lambda

// Lambda开胃菜
    // 返回String
    fun show01(number:Int, lambda:(Int)->String) = lambda.invoke(number)
    // 调用函数
    var r01 = show01(99){
        it.toString()
    }

    // return Int
    fun show02(n1:Int,n2:Int,n3:Int, lambda: (Int,Int,Int)->Int) = lambda(n1, n2, n3)
    show02(10, 20, 30){
        i, i2, i3 ->
            i + i2 + i3
    }

3、高阶函数例子

// 第一版,高阶函数应用
fun main() {
    loginEngine("wch", "123456")
}

private fun loginEngine(name:String, pwd:String){
    loginServer(name, pwd){
        code, msg->
            print("错误码$code 错误信息$msg")
    }
}

private fun loginServer(name:String, pwd:String, lambda:(Int, String)->Unit){
    if(name.isEmpty() || pwd.isEmpty()){
        lambda(-1, "Empty")
        return
    }
    lambda(1, "Success")
}
// 第二版

4、高阶函数

// (一)给泛型增加匿名扩展函数
fun<T> T.myRun01(block: T.(Float) -> Boolean) = block(123.45f)
// this = T本身 = 调用者本身 == Derry

// 使用
"Derry".myRun01 {
    isEmpty()
}

// (二)
fun<T> T.derry4(number:Double, mm: T.(Double) -> Unit){
    mm(number)
}
"Derry".derry4(123.456){
    // this = 调用者
    println(this)
}

// (三)
fun<T> T.myRunPlus(block: T.(T, T) -> Boolean) = block(this,this)

5、T.() -> Boolean s是什么意思?

  1. 对T扩展出匿名函数
  2. 匿名函数是 ()->Boolean
  3. 该匿名扩展函数只有这个高阶函数可以使用,其他地方用不出来

6、多个lambda调用

// (一)
show2(lambda1 = {}, lambda2 = {})
//(二)
show2({}, {})
// (三)
show2({println("Hello")}){
    println("World!")
}

7、源码使用高阶函数,利用函数引用

show(::lambdaImpl)

fun lambdaImpl(){
    println("HAHA")
}

// 函数引用场景
fun lambdaImpl(name:String):Unit{
    println(name)
}
var r1:Function1<String, Unit> = ::lambdaImpl
var r2:(String)->Unit = ::lambdaImpl
var r3:String.()->Unit = ::lambdaImpl // (String)等价于String.()

集合、泛型

1、Lambda+集合+泛型

class AndroidClickListener<T>{
    // 1. 集合的元素类型是Lambda,并且Lambda输入参数的类型是 T
    val actions = arrayListOf<(T)->Unit>()
    val actions2 = arrayListOf<(T?)->Unit>() // 可空
    
    // 2. 集合的元素类型为泛型
    val values = arrayListOf<T?>()

    // 3、设置监听
    fun addListener(value:T?, lambda:(T?)->Unit){
        values += value // 运算符重载
        actions2 += lambda
    }
    // 4、通知观察者
    fun notify(value:T?){
        val index = values.indexOf(value)
        actions2[index].invoke(value) // 执行方法
        actions2[index](value) // 执行方法二
    }
    // 5. 模拟点击事件,通知所有观察者
    fun touchListeners(){
        actions2.forEachIndexed{
            index, function ->  
                function(values[index])
        }
    }
}

// 使用,测试
    val click = AndroidClickListener<String>()
    click.addListener("HaHa"){
        println("接收到数据:$it")
    }
    click.addListener("WCH"){
        println("$it 在吃饭中...")
    }
    click.addListener("Feather"){
        println("百万博客主:$it")
    }
    click.touchListeners()


// 函数引用版本
    fun method(value:String?){
        println(value)
    }
    click.addListener("Hello", ::method)

2、如何用变量接收类型中包含泛型的函数?

fun<T> method(value: T?):Unit{
    println(value)
}
    // 不可以用泛型
//    val error:(T?)->Unit = ::method
    // Any来代表T?
    val m1:(Any)->Unit = ::method
    m1("Hello")
    // 具体类型也可以
    val m2:(Int)->Unit = ::method
    m2(123)

自己实现Kotlin内置函数

1、forEach

// 定义
inline fun<E> Iterable<E>.mForEach(lambda:(E)->Unit){
    for(item in this)lambda(item)
}

// 使用
listOf("AAA", "BBB", "CCC")
    .mForEach{
        println(it)
    }

2、let和run,为什么会有this,为什么会有it

  1. this,it
  2. T.()->R, this是对T的匿名扩展函数,拥有this
  3. (T)->R,it是参数类型,SAM单一抽象接口,函数式接口,it
public inline fun <T, R> T.run(block: T.() -> R): R {
    return block()
}
public inline fun <T, R> T.let(block: (T) -> R): R {
    return block(this)
}

3、thread

  1. 注意点: corssinline
// 自己实现thread,特定lambda不能inline
inline fun thread(start:Boolean = true,
                  name:String?=null,
                  crossinline runAction:()->Unit // 限制不能inline,会copy大量代码
):Thread{
    val thread = object:Thread(){
        override fun run() {
            super.run()
            runAction()
        }
    }
    if(start) thread.start() // 
    name?.let { thread.name = it } // kotlin形式
    return thread
}

扩展函数原理

1、扩展函数就是构造static final方法,将对象作为返回值

class MyKt {}
fun MyKt.show() = println(this)
public final class MyKt {}
// 构造出Kt类,添加扩展函数名一样的static final方法,将类的对象作为参数
public final class MyKtKt {
   public static final void show(@NotNull MyKt $this$show) {
      Intrinsics.checkNotNullParameter($this$show, "$this$show");
      System.out.println($this$show);
   }
}

2、思考:叫做扩展函数是否是因为没有receiver?

companion object 原理 ==> 静态内部类

1、为什么叫伴生对象?

  1. 生成静态内部类
  2. 生成静态成员变量(类变量)
  3. 通过伴生对象实例,调用方法和获取字段

2、使用处

class MyKt {
    companion object{
        fun show(){
            println(this)
        }
        val name = "wch"
    }
}

fun main() {
    MyKt.show()
    MyKt.name
}

3、反编译,生成源码

  1. 生成静态内部类,Companion,并且有show()方法和字段name
  2. 类中Companion实例,是static final变量
  3. 像Java一样调用类方法和获取类属性,本质通过Companion伴生对象,调用方法和get字段
public final class MyKt {
   private static final String name = "wch";
   public static final Companion Companion = new Companion((DefaultConstructorMarker)null);
   public static final class Companion {
      public final void show() {
         System.out.println(this);
      }

      public final String getName() {
         return MyKt.name;
      }

      private Companion() {
      }
      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

// 使用处
MyKt.Companion.show();
MyKt.Companion.getName();

函数式编程

Kotlin函数式编程

  1. 链式调用
  2. 非常丰富的函数库
  3. 模仿RxJava的响应式编程
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin Lambda和高阶函数 的相关文章

  • Kapt 未在即时应用程序功能模块中生成类

    我在我的 Android 应用程序中使用 dagger2 即使没有错误 它也不会生成匕首组件类 我已经在设置中启用了注释处理器并重新启动了我的 android studio 但这对我来说不起作用 我也读过这个帖子Dagger2 不生成 Da
  • Android Manifest 自动生成无效权限

    我不小心在 Android 清单中输入了无效的权限名称 并且无法将其删除 这是我的清单代码
  • 编译后从字节代码中删除注释

    我们正在使用一个包含使用 JAXB 注释进行注释的 bean 的库 我们使用这些类的方式完全不依赖于 JAXB 换句话说 我们不需要 JAXB 也不依赖注释 但是 由于注释存在 它们最终会被处理注释的其他类引用 这要求我将 JAXB 捆绑到
  • Android Facebook sdk 3.5 分享对话框

    您好 我正在为 android sdk 3 5 实现 facebook 共享对话框 但是我按照指南没有取得任何成功 FacebookDialog shareDialog new FacebookDialog ShareDialogBuild
  • Android 谷歌地图 V2 已停止

    我正在尝试构建地图应用程序并关注这个链接 https blog emildesign rhcloud com p 435一步步 我在这里找到了类似的主题 但对我没有帮助 我想显示地图 但是当我运行它时 它返回强制关闭和我的 Android
  • 在后台服务中持续获取位置更新

    我正在开发需要在后台服务中持续获取位置更新的应用程序 我已经使用了它正在使用的后台粘性服务 但是 即使我添加了启动广播并在那里启动了服务 启动完成后服务也没有启动 服务启动并立即被杀死 另外 这不适用于奥利奥 服务在应用程序关闭几分钟后停止
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • 更改 Android 中的媒体音量?

    我可以更改媒体音量吗 如何 到目前为止我用过这个 setVolumeControlStream AudioManager STREAM MUSIC 但有一个搜索栏并且想要更改媒体音量 而不是铃声音量 那么有人可以告诉我如何更改媒体音量onC
  • 将图像保存到内部存储器并将出现在图库中

    我搜索了很多与我的问题相关的问题 是否有办法将图像存储在内存中并且它也应该出现在图库中 这是完全有可能的 我以前也这么做过 在将图像保存到内存 或称为应用程序文件夹等 之前 您最好设置Context MODE WORLDREADABLE 虽
  • 如何更改对话框片段内的片段

    我想做一个空的DialogFragment with a LinearLayout然后更改里面的片段LinearLayout 例如 第一个片段是 3 个按钮 facebook google 电子邮件登录 的登录 当有人按下电子邮件时 第 2
  • android 多关键词搜索

    我的应用程序包含搜索功能 它将搜索数据库内的内容 我的搜索的弱点是 我只能使用一个标签进行搜索 例如我只能搜索 猫 它会返回我的数据库中包含 猫 一词的内容 因为我正在使用LIKE在 select 语句期间进行查询 如何使用多个标签进行搜索
  • Android 消费品:“已经拥有该商品”,但 inventory.hasPurchase() 为 false

    我被 Google In App v3 困住了 我测试了一次没有消费的购买 例如 当应用程序在购买和消费之间崩溃时 现在我找不到出路 如果我尝试再次购买 它会显示 您已经拥有该商品 但是当我测试所有权时 它说我不拥有它 Inventory
  • Spotify 登录错误 INVALID_CLIENT:无效的重定向 URI android

    我正在制作一个包含 Spotify 集成的应用程序 我点击了此链接https developer spotify com technologies spotify android sdk tutorial https developer s
  • 截图显示黑色

    我正在拍摄快照并创建缩略图 然后共享此图像 但缩略图显示全黑 我使用了以下代码 Bitmap bitmap View v1 v getRootView v1 setDrawingCacheEnabled true bitmap Bitmap
  • 在 android 中,第一次单击时按钮侦听器未注册

    因为我是 Android 新手 所以我遇到了按钮监听器的问题 我正在使用 OnClickListener 来处理胸像 但它第一次点击后不执行一旦我单击多个 它就会表现良好 但如何使其在第一次单击时成为可能 这是我的代码 public cla
  • Android 4.2 - Environment.getExternalStorageDirectory().getPath() 行为

    我一直在开发一个android应用程序 在上次更新到4 2之前 我使用 Environment getExternalStorageDirectory getPath 它返回了我 storage sdcard0 但自从更新后我现在得到了 s
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • Application.onLowMemory() 未调用

    我创建了自己的应用程序类 我尝试调试它 代码在 Application onCreate 处停止 但不会在 onLowMemory 处停止 为了测试该场景 我打开了许多其他高内存应用程序 我看到的是调试会话终止 在 Eclipse 中 并且
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • 查询联系人 - 有时返回空游标

    我正在尝试查询联系人的显示名称 Override public void onActivityResult int requestCode int resultCode Intent data switch requestCode case

随机推荐

  • Linux下修改java.library.path

    第一步 打印出当前的java library path有哪些目录 执行 vi Test java 切换编辑模式 i 插入如下代码 public class Test public static void main String args S
  • Anaconda创建新环境,CondaHTTPError: HTTP 000 CONNECTION FAILED for url <http://mirrors.tuna.tsinghua问题解决过程

    两步即可 第一步 配置anaconda为清华源 在Anaconda Prompt终端依次执行这些命令 conda config add channels http mirrors tuna tsinghua edu cn anaconda
  • MQTT协议

    http www blogjava net yongboy category 54835 html
  • 树莓派的连接与AP局域网路由器配置

    文章目录 前言 1 树莓派的连接 1 1 本地连接 1 2 远程连接 2 AP路由器配置 2 1 配置无线局域网 2 2 配置以太网实现局域网 前言 树莓派的连接方式分为两种 本地和远程 也可以通俗的说是有本地设备还是就一台笔记本的情况 本
  • 解决:无法解析的外部符号__iob_func

    解决 无法解析的外部符号 iob func 原文 http blog csdn net hebbely article details 53780562 在使用 VS2015 下使用 libjpeg turbo 静态库 编译时报错了 cpp
  • 【用户增长】用户增长方法论及增长思维

    用户增长方法论及增长思维 1 什么是用户增长 1 1 用户增长的概念及内涵 用户增长不是简单的用户数量的增长 用户增长是一个系统化 综合化的体系 用户增长包含三个阶段的增长 综上三点 我们可以简单的将用户增长定义为 通过痛点 产品 渠道 创
  • 编写第一个Makefile(HelloWorld)

    什么是Makefile 讲makefie之前 先将将什么是make make是一个命令工具 是一个解释makefile中指令的命令工具 它可以简化编译过程里面所下达的指令 当执行 make 时 make 会在当前的目录下搜寻 Makefil
  • 建站系列(八)--- 本地开发环境搭建(WNMP)

    目录 相关系列文章 前言 一 准备工作 二 Nginx安装 三 MySQL安装 四 PHP安装及Nginx配置 五 总结 相关系列文章 建站系列 一 网站基本常识 建站系列 二 域名 IP地址 URL 端口详解 建站系列 三 网络协议 建站
  • ServletConfig对象

    目录 一 ServletConfig对象定义 二 ServletConfig对象作用 三 ServletConfig中的方法 一 ServletConfig对象定义 ServletConfig是什么 ServletConfig是一个接口 位
  • 3. 无重复字符的最长子串

    给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解释 因为无重复字符的
  • [转]iPhone多渠道自动打包Shell脚本介绍

    转 iPhone多渠道自动打包Shell脚本介绍 摘要 随着苹果手持设备用户的不断增加 ios应用也增长迅速 同时随着iphone被越狱越来越多的app 的渠道也不断增多 为各个渠道打包成了一件费时费力的工作 本文提供一种比较智能的打包方式
  • Java方法递归的简单例题

    目录 递归 1 递归求N 的阶乘和递归求1 2 3 4 n 2 按顺序打印一个数字的每一位 3 斐波那契数列和青蛙跳台阶问题 4 汉诺塔问题 递归 递归 简单来说 就是方法自己调用自己的过程 那要怎么样去实现递归呢 首先 我们需要去根据条件
  • 单页面(SPA)与服务端渲染(SSR),概念、区别,优缺点

    单页面 SPA 与服务端渲染 SSR 概念 区别 优缺点 什么是单页面应用 什么是多页面应用 二者有什么区别 1 单页面应用与多页面应用 单页面顾名思义就是整个应用只有一个Html页面 页面的切换其实是组件的切换 这样设计的好处就是不进行页
  • 多元回归分析

    多元回归分析 RF随机森林多输入单输出预测及变量重要度衡量 Matlab完整程序 目录 多元回归分析 RF随机森林多输入单输出预测及变量重要度衡量 Matlab完整程序 预测结果 评价指标 基本介绍 程序设计 参考资料 预测结果 评价指标
  • 进程——wait函数

    wait 的函数原型是 include
  • 使用Vue-Cli4.x配置文件路径别名

    vue脚手架版本升级到4 x以后 目录发生了很大的变化 有些配置需要我们自己去配置 自己项目中的目录结构 在根目录创建一个 vue config js文件 配置一下引入文件路径的别名 const path require path cons
  • C++报错 invalid operands to binary expression

    invalid operands to binary expression 二进制表达式的操作数无效 顾名思义 错误出在操作符上 对类型的操作问题 比如两种不能比较的类型进行了比较 比如我这里
  • 剑指Offer第三十一题:整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述 求出1 13的整数中1出现的次数 并算出100 1300的整数中1出现的次数 为此他特别数了一下1 13中包含1的数字有1 10 11 12 13因此共出现6次 但是对于后面问题他就没辙了 ACMer希望你们帮帮他 并把问题更加普
  • 组合pig和hive来进行数据分析

    接到产品一个任务 需要对使用产品的用户操作系统来个分析 对清洗后的hive数据进行分析 发现 数据恰恰把操作系统数据 进行了过滤 只有到rawlog里去进行数据分析了 但由于rawlog没有和数据库进行关联 就只有先对rawlog进行初步手
  • Kotlin Lambda和高阶函数

    Lambda和高阶函数 本文链接 文章目录 Lambda和高阶函数 lambda 输出 返回类型 深入探究 泛型 inline原理探究 高阶函数 集合 泛型 自己实现Kotlin内置函数 扩展函数原理 companion object 原理