0

array: があり、次のコードでnotes: Array<KeyValueNote>?Kotlin を使用しています。1.0.5-2

私が欲しい

if (notes != null) {
    for (note in notes) {
        // Put the note to the payload Json object only if the note is non-null.
        payloadJson.put(note.key, note.value)
    }
}

しかし、いくつかの変更点があります

    // Alternative 1.
    notes?.let {
        it.takeWhile { it != null /** Inspection will note The condition 'it != null' is always true' in here**/ }.forEach { payloadJson.put(it.key, it.value) }
    }

    // Alternative 2.
    notes?.takeWhile { it != null /** Inspection will note The condition 'it != null' is always true' in here**/ }?.forEach { payloadJson.put(it.key, it.value) }

    // Alternative 3.
    notes?.filterNotNull()?.forEach { payloadJson.put(it.key, it.value) }

私の質問

  1. The condition 'it != null' is always true代替案 1&2 に検査メモがあることがわかりますが、検査は正しいですか? の非 null アイテムのみを にnotes配置できるようにしたいためpayloadJsonです。
  2. filterNotNull()?.代替案 3 では、にSafe? Call があることがわかります。、ソース コードを確認したため、結果filterNotNull()が null になることはありませんが?、そこを削除するとコンパイルに失敗します。
4

3 に答える 3

2

検査は正しい。notes 変数を、null 非許容項目の null 許容配列として宣言します。

notes: Array<KeyValueNote>? // Can be null, cannot contain nulls.
notes: Array<KeyValueNote?> // Cannot be null, can contain nulls.

これを念頭に置いて、filterNotNull()?. この配列は null 許容であるため、この配列に必要です。Kotlin の null 安全性の詳細については、Kotlin のドキュメントを参照してください。

于 2016-11-27T08:34:38.870 に答える
1

の型はnotesis ですArray<KeyValueNote>?。これは、配列の要素をnull にすることはできませんが、配列自体はできることを意味します。したがって、「欲しい」セクションのコードは正しいです。より短い代替案は次のようになります。

notes?.forEach { payloadJson.put(it.key, it.value) }

あなたの選択肢について:

  • 選択肢 1:letこのように使用しないでください。これは安全な呼び出し?.(Alternative 2 のように) でなければならず、他には何もありません。そのような状況を見ると、私の心は出血しますlet:(

  • 選択肢 2:takeWhilefilterは明らかに同じではありません。filterNotNullオルタナティブ3のように、あなたが望んでいたと思います

  • 代替案 3: 配列の要素を null にすることはできないため (型が原因で)、コンテンツをコピーするだけなのでfilterNotNull同等です。toList

于 2016-11-27T08:37:06.633 に答える
1

itさまざまなスコープで使用されるパラメーターに混乱していると思います。最初の選択肢は次のように書き直すことができます。

notes?.let { notesSafe:Array<KeyValueNote> -> // notesSafe is not null here
    notesSafe
      .takeWhile { item:KeyValueNote -> item != null } // item is already not null by it's type definition
      .forEach { payloadJson.put(it.key, it.value) }
}

2番目の選択肢はほとんど同じでありitem:KeyValueNote、同じ理由でコンパイラの注意事項が当てはまります。値val items:Array<KeyValueNote>?を保持できませんnull-しかし、itemsそれ自体はnull.

3 番目の選択肢には、値が削除されたfilterNotNullソース コレクションを返す安全な呼び出しがあります。nullただし、前述のように値を含めるArray<KeyValueNote>ことはできないため、必須ではありません。nullfilterNotNull

結論として、式は次のように記述できます。

notes?.forEach { payloadJson.put(it.key, it.value) }
于 2016-11-27T08:39:55.497 に答える