对于用作表达式的Kotlin函数,是否有简洁的方法来操作并返回值?

时间:2017-05-26 23:57:14

标签: android rx-java kotlin rx-java2 rx-kotlin

在Kotlin中,函数的最终语句可以解释为其返回值。

是否可以将以下示例的情况简化为更简洁?

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission
    android:name="android.permission.MODIFY_PHONE_STATE"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    .
    .
    .

    <receiver android:name=".BootBroadcastReceiver"
        android:enabled="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <uses-permission android:name="android.permission.WAKE_LOCK" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    <receiver android:name=".Tasks"
        android:enabled="true">
    </receiver>

</application>

我希望这样做的具体案例如下,在使用RxJava的示例中 - 即使有更好的Rx方法,我也对纯Kotlin解决方案感兴趣(如果存在)。

{ text: String ->
  val validated = validateText(text)
  if (validated) {
    actOnValidation()
  }
  validated
}

1 个答案:

答案 0 :(得分:5)

您可以使用also()来操作并返回接收器:

{ text: String ->
    validateText(text).also { valid ->
        if (valid) actOnValidation()
    }
}

你也可以这样写,但我更喜欢第一种形式,因为我觉得它更清楚:

{ text: String ->
    validateText(text).also {
        if (it) actOnValidation()
    }
}