18

Java 8Listの今後のリリースで新しいラムダ機能を使用して、.**new** List

これListは、呼び出し元によって a が渡され、すべての内容を新しい値に変更するために関数を適用する必要がある場合に関係します。たとえば、方法Collections.sort(list)はリストをその場で変更します。

この変換関数とこの開始リストが与えられた場合、新しいリストを作成せずに元のリストのすべての値に関数を適用する最も簡単な方法は何ですか?

String function(String s){ 
    return s.toUppercase(); // or something else more complex
}

List<String> list = Arrays.asList("Bob", "Steve", "Jim", "Arbby");

インプレースですべての値に変更を適用する通常の方法は次のとおりです。

for (int i = 0; i < list.size(); i++) {
    list.set(i, function( list.get(i) );
}

ラムダと Java 8 は以下を提供しますか?

  • もっと簡単で表現力豊かな方法?
  • for(..)ループのすべての足場を設定せずにこれを行う方法は?
4

3 に答える 3

33
    List<String> list = Arrays.asList("Bob", "Steve", "Jim", "Arbby");
    list.replaceAll(String::toUpperCase);
于 2013-10-31T15:04:11.070 に答える
2

人気のあるライブラリGuavaを使用すると、新しい配列にメモリを割り当てない計算ビューをリストに作成できます。つまり、次のようになります。

upperCaseStrings = Lists.transform(strings, String::toUpperCase)

より良い解決策が@StuartMarksによって提案されていますが、コレクションのジェネリック型も変更できるため、この回答を残しています。


別のオプションは、mutateリストとラムダをパラメーターとして受け取る静的メソッドを宣言し、静的メソッドとしてインポートすることです。


mutate(strings, String::toUpperCase);

可能な実装mutate:

@SuppressWarnings({"unchecked"})
public static List mutate(List list, Function function) {
    リスト objList = リスト;

    for (int i = 0; i

于 2013-10-31T08:58:36.843 に答える
-1

forEachの要素を変更するために使用できるを見落としているようですList。もちろん、これでユース ケースが完全にカバーされるわけではありません。要素が不変である場合や、要素を完全に置き換えたい場合には役に立ちません。[編集: 次の文は、質問で指定されているコレクションではなく、ストリームに関連しています] これらの操作を実行できないのには十分な理由があります: それらは並列に適していません (これは実際にforEachも適用されます) およびストリームAPI では、シーケンシャルのみの操作を使用しないことを強くお勧めします。

于 2013-10-31T10:01:10.120 に答える