Matlab实现深度置信网络回归预测模型全解析
2026/8/9 4:38:46
| 函数 | 对象引用 | 返回值 | 是否扩展函数 | 典型使用场景 |
|---|---|---|---|---|
| let | it | Lambda结果 | 是 | 空安全调用、数据转换 |
| run | this | Lambda结果 | 是 | 对象配置并计算结果 |
| with | this | Lambda结果 | 否 | 对非空对象执行多个操作 |
| apply | this | 对象本身 | 是 | 对象初始化和配置 |
| also | it | 对象本身 | 是 | 附加操作(日志、验证) |
| takeIf | it | 对象或null | 是 | 条件过滤 |
| takeUnless | it | 对象或null | 是 | 反向条件过滤 |
// ❌ 传统写法valname:String?=getUserName()if(name!=null){println(name.length)}// ✅ let 写法getUserName()?.let{name->println(name.length)}// ✅ 更简洁getUserName()?.let{println(it.length)}// 将 JSON 字符串转换为对象intent.getStringExtra("data")?.let{json->Gson().fromJson(json,User::class.java)}?.let{user->// 使用转换后的 user 对象showUserInfo(user)}// 避免污染外部作用域valresult=getData()?.let{data->valprocessed=processData(data)valvalidated=validate(processed)validated.result}// ❌ 传统写法valperson=Person()person.name="张三"person.age=25person.address="北京"// ✅ apply 写法valperson=Person().apply{name="张三"age=25address="北京"}// 配置标题栏viewBinding.inTitle.apply{ivBack.setOnClickListener{finish()}tvTitle.text="设置"tvRight.visibility=View.VISIBLE tvRight.text="保存"}recyclerview.apply{layoutManager=LinearLayoutManager(context)adapter=MyAdapter(dataList)addItemDecoration(DividerItemDecoration(context))setHasFixedSize(true)}// 在数据流中添加日志,不影响链式调用getData().also{Log.d("TAG","获取到的数据:$it")}.map{it.transform()}.also{Log.d("TAG","转换后的数据:$it")}.filter{it.isValid}viewModel.user=User().also{user->user.id=generateId()saveToDatabase(user)notifyUserCreated(user)}Request.Builder().url("https://api.example.com").also{builder->if(needsAuth){builder.addHeader("Authorization",token)}}.build()valresult=person.run{valfullName="$firstName$lastName"valinfo="姓名:$fullName, 年龄:$age"info.length>10// 返回布尔值}intent.getStringExtra("data")?.let{Gson().fromJson(it,User::class.java)}?.run{// 在 user 对象上下文中执行多个操作viewModel.user=thisupdateUI()startService()}// 使用 this 引用更自然service?.run{connect()startListening()this.connectionStatus// 可以显式使用 this}// ❌ 传统写法valbuilder=StringBuilder()builder.append("Hello")builder.append(" ")builder.append("World")valresult=builder.toString()// ✅ with 写法valresult=with(StringBuilder()){append("Hello")append(" ")append("World")toString()// 返回值}with(canvas){drawRect(0f,0f,100f,100f,paint)drawCircle(50f,50f,25f,paint)drawText("Hello",10f,20f,paint)}// ❌ 不推荐 - with 不支持空安全valuser:User?=getUser()with(user){// 编译错误或需要额外判空println(name)}// ✅ 应该用 runuser?.run{println(name)}// ❌ 传统写法valage=getAge()valvalidAge=if(age>0&&age<150)ageelsenull// ✅ takeIf 写法valvalidAge=getAge().takeIf{itin1..149}viewModel.getRechargeRecords{code->code.takeIf{it==200}// 只有成功才继续?.let{viewModel.rechargeRecordsBean}?.takeIf{it.list?.isNotEmpty()==true}// 列表不为空才继续?.also{initRecyclerview()}}// ❌ 传统写法valuser=getUser()if(user!=null&&user.isActive&&user.age>=18){processUser(user)}// ✅ takeIf 写法getUser()?.takeIf{it.isActive}?.takeIf{it.age>=18}?.let{processUser(it)}// ✅ takeUnless 写法 - 字符串不为空时才处理intent.getStringExtra("name")?.takeUnless{it.isEmpty()}?.let{name->println("用户名:$name")}// 等价于 takeIfintent.getStringExtra("name")?.takeIf{it.isNotEmpty()}?.let{name->println("用户名:$name")}// 排除负数getScore().takeUnless{it<0}?.let{validScore->updateScore(validScore)}// 排除空列表getDataList().takeUnless{it.isEmpty()}?.let{list->showList(list)}// 规则:哪个更符合自然语言就用哪个// ✅ 好 - 符合自然语言list.takeIf{it.isNotEmpty()}// "如果不为空"// ❌ 不自然list.takeUnless{it.isEmpty()}// "除非为空" - 别扭// ✅ 好 - 符合自然语言user.takeUnless{it.isBanned}// "除非被封禁"// ❌ 不自然user.takeIf{!it.isBanned}// "如果没被封禁" - 双重否定// ❌ 传统写法funlogin(username:String?,password:String?){if(username!=null&&username.isNotEmpty()){if(password!=null&&password.isNotEmpty()){valuser=authenticate(username,password)if(user!=null){if(user.isActive){saveUser(user)navigateToHome()Log.d("Login","用户${user.name}登录成功")}else{showError("账号已被禁用")}}else{showError("用户名或密码错误")}}else{showError("请输入密码")}}else{showError("请输入用户名")}}// ✅ Kotlin 作用域函数写法funlogin(username:String?,password:String?){username?.takeUnless{it.isEmpty()}?.also{password?.takeUnless{it.isEmpty()}?:showError("请输入密码")}?.let{user->authenticate(user,password!!)}?.takeIf{it.isActive}?.also{user->saveUser(user)navigateToHome()}?.also{Log.d("Login","用户${it.name}登录成功")}?:showError("登录失败")}// ❌ 传统写法funsetupRecyclerView(data:List<Item>?){if(data!=null&&data.isNotEmpty()){valadapter=MyAdapter(data)vallayoutManager=LinearLayoutManager(this)recyclerview.layoutManager=layoutManager recyclerview.adapter=adapter recyclerview.addItemDecoration(DividerItemDecoration(this))Log.d("TAG","RecyclerView 已初始化,数据量:${data.size}")}}// ✅ Kotlin 作用域函数写法funsetupRecyclerView(data:List<Item>?){data?.takeUnless{it.isEmpty()}?.let{items->recyclerview.apply{layoutManager=LinearLayoutManager(this@MainActivity)adapter=MyAdapter(items)addItemDecoration(DividerItemDecoration(context))}.also{Log.d("TAG","RecyclerView 已初始化,数据量:${items.size}")}}}// ❌ 传统写法funparseIntentData(){valuserJson=intent.getStringExtra("user")if(userJson!=null&&userJson.isNotEmpty()){valuser=Gson().fromJson(userJson,User::class.java)if(user!=null){viewModel.user=uservalage=user.ageif(age>=18){showAdultContent()}Log.d("TAG","解析用户:${user.name}")}}}// ✅ Kotlin 作用域函数写法funparseIntentData(){intent.getStringExtra("user")?.takeUnless{it.isEmpty()}?.also{Log.d("TAG","接收到 JSON:$it")}?.let{Gson().fromJson(it,User::class.java)}?.also{viewModel.user=it}?.also{Log.d("TAG","解析用户:${it.name}")}?.takeIf{it.age>=18}?.run{showAdultContent()}}需要返回对象本身吗? ├─ 是 │ ├─ 需要 this 引用? → apply (对象配置) │ └─ 需要 it 引用? → also (附加操作、日志) │ └─ 否(返回 Lambda 结果) ├─ 需要 this 引用? │ ├─ 是扩展函数? → run (对象作用域计算) │ └─ 非扩展函数? → with (确定非空对象操作) │ └─ 需要 it 引用? → let (空安全、数据转换) 需要条件过滤? ├─ 符合条件才继续 → takeIf (正向过滤) └─ 不符合才继续 → takeUnless (反向过滤)// ❌ 过度使用,难以理解data?.let{it.filter{it.isValid}.map{it.name}.takeIf{it.isNotEmpty()}?.also{it.forEach{println(it)}}}// ✅ 适度使用,清晰易读data?.filter{it.isValid}?.map{it.name}?.takeUnless{it.isEmpty()}?.forEach{println(it)}// ❌ 嵌套太深data?.let{d1->d1.process()?.let{d2->d2.validate()?.let{d3->d3.save()}}}// ✅ 扁平化链式调用data?.let{it.process()}?.let{it.validate()}?.let{it.save()}// ✅ 使用 this - 当对象方法较多时person.apply{name="张三"age=25updateProfile()}// ✅ 使用 it - 当需要明确对象来源时getUser()?.let{user->viewModel.currentUser=usershowUserInfo(user)}| 场景 | 推荐函数 |
|---|---|
| 空安全调用 | let |
| 对象初始化配置 | apply |
| 添加日志、副作用 | also |
| 对象作用域计算 | run |
| 非空对象多操作 | with |
| 条件过滤(正向) | takeIf |
| 条件过滤(反向) | takeUnless |
记住:没有绝对的规则,选择让代码最易读的方式!