3

Java (または同様の言語) では、リストから要素を削除する純粋な関数(またはメソッド) をどのように記述しますか。

要素がリストにある場合は、入力リストのすべての要素から削除した要素を除いた新しい (理想的には不変の) リストを返すだけです。

しかし、要素がリストに見つからない場合はどのように処理しますか?

メソッドがと 削除するの 2 つのパラメーターを受け取るlistとします。element

public SOMETHING remove(final List<String> list, final String element){
    // Copy the input list and remove the first occurrence of 'element', if I find it.
    // 
    // if I don't find it ... do something clever here ...
}

このメソッドを呼び出し、element内部に含まれていない場合list:

  • 例外をスローすると、おそらくメソッドが「不純」になります (?)
  • 入力リストを変更してブール値を返す ( List#remove()と同様) と、メソッドが「不純」になると考えられます (入力の変更は副作用になります)。
  • このメソッドを呼び出していた場合、入力を出力として返すことは直感的ではないように思えます。
  • を返しますOptional.of(listCopy)(編集:投稿後に質問に追加されました)
  • 他のアイデアはありますか?

編集

の最初の出現のみを削除したいことを述べたはずですelement。そのため、入力listに が複数出現する場合element、remove() メソッドへの 1 回の呼び出し (たとえば を使用) ですべてを削除したくありませんstream().filter()。これを反映するために、コード例のコメントを編集しました。ただし、これは私の質問には完全には関係ありません。私の主な質問は、メソッドを直感的に使用し、「純粋」に保つ方法を中心に展開しているためです。

編集2

上記の提案に追加のアイデアを追加しました。戻るOptional.of(listCopy)ことは、これまでに提案されたソリューションの中で最もエレガントなソリューションのようです。要求された操作が成功したかどうかを呼び出し元に強制的にチェックさせ、AND (成功した場合) は新しいリストを返すため、元の入力リストは変更されません。操作が失敗した (element内に見つからなかったlist) 場合、メソッドは を返しますOptional.empty()これは、後述の参照整合性も満たしているように思えます。

4

5 に答える 5