2016-12-28 83 views
0

我在Java中,这代码空检查中如果条件

return mFingerprintManager.hasEnrolledFingerprints() && 
     createKey(DEFAULT_KEY_NAME, true) && 
     initCipher(mCipher, DEFAULT_KEY_NAME); 

如下所示

return mFingerprintManager.hasEnrolledFingerprints() && 
     createKey(DEFAULT_KEY_NAME, true) && 
     if (mCipher != null) { 
      mCipher?.apply { initCipher(this, DEFAULT_KEY_NAME) } 
      return true 
     } else { 
      return false 
     } 

有没有更好的方式来写科特林代码,所以它是一个我已经转化为科特林更简洁?变量mCipher定义为

private var mCipher: Cipher? = null 

在类级别。

+0

为什么不科特林Java代码工作的是什么? 'initCipher'没有返回一个'Boolean'吗? – mfulton26

+0

问题是Kotlin抱怨mCipher可能在null检查和initCipher中的访问之间发生了变化。 – Francesc

+1

很高兴看到'initCipher' – voddan

回答

3

?.如果接收方不为null,则返回函数的结果,否则返回null。

结合这与.apply我们可以这样写:

[..] && mCipher?.apply { initCipher(this, DEFAULT_KEY_NAME) } != null

+1

的签名很酷,谢谢 - 我错过了我可以利用apply的返回。 – Francesc

+0

在这种情况下使用'let'会更好。 – voddan

0

等待,你为什么不能复制 - 粘贴Java代码科特林?这将作为-是:

return mFingerprintManager.hasEnrolledFingerprints() 
     && createKey(DEFAULT_KEY_NAME, true) 
     && initCipher(mCipher, DEFAULT_KEY_NAME) 

如果initCipher(...)可以处理null作为它的参数,那么你就需要将它传递给方法之前检查mCipher

更新:

看来你已经转换initCipher从Java到科特林,现在不能接受null作为其参数。然后,假设你不必mCipher并发访问,添加一个空断言!!的代码:

return mFingerprintManager.hasEnrolledFingerprints() 
     && createKey(DEFAULT_KEY_NAME, true) 
     && initCipher(mCipher!!, DEFAULT_KEY_NAME)