どのように私はJavaで配列を超えるマッピングすることができますか?

アシュトンWiersdorf:

私は、文字列の配列を持っています

String[] suffixes = getSuffixes();

そして、私は追加の接頭辞を持つ古いものに基づいて、新しい配列をしたいです。私は、RubyやJavaScript、PerlやLispの、などでこのような何かをしたいです:

// pseudocode for what I would like

String[] full_words = suffixes.map(suffix => "re" + suffix);

私は自分のアプリケーションでの配列に制限されています。(これは学校の割り当てのごく一部であり、私はコレクションのライブラリを使用することはできませんよ。)は、Java 8でこれを行うにはどのような方法?

khachik:
String [] full_suffixes = Arrays.stream(suffixes)
                          .map(suffix -> "re" + suffix)
                          .toArray(size -> new String[size])

「老いた昔ながらの」ループはあまりにも冗長です。

String [] full_suffixes = new String[suffixes.length];
for(int i = 0; i < suffixes.length; i++) {
    full_suffixes[i] = "re" + suffixes[i];
}

「あまりにも速い」コメントに対処するために:

import java.util.Arrays;

public class Test {
    static int N = 10000;
    public static void main(String [] args) throws Exception {
        if(args.length > 0) {
            N = Integer.parseInt(args[0]);
        }
        String [] array = new String[100000];
        for(int i = 0; i < array.length; i++) {
            array[i] = "abcdef" + i;
        }
        long start = System.currentTimeMillis();
        fancy(array);
        System.err.println("Fancy took " + (System.currentTimeMillis() - start) + "ms");
        start = System.currentTimeMillis();
        oldSchool(array);
        System.err.println("Loop took " + (System.currentTimeMillis() - start) + "ms");

    }

    public static void fancy(String [] array) {
        for(int i = 0; i < N; i++) {
            String [] full_suffixes = Arrays.stream(array)
                                          .map(suffix -> "re" + suffix)
                                          .toArray(size -> new String[size]);
        }
    }

    public static void oldSchool(String [] array) {
        for(int i = 0; i < N; i++) {
            String [] full_suffixes = new String[array.length];
            for(int j = 0; j < array.length; j++) {
                    full_suffixes[j] = "re" + array[j];
            }
        }
    }
}

(1.8.0_60をJDK)の実行:

$ java Test 100
Fancy took 502ms
Loop took 398ms
$ java Test 1000
Fancy took 3067ms
Loop took 2227ms
$ java Test 5000
Fancy took 13288ms
Loop took 11494ms
$ java Test 10000
Fancy took 27744ms
Loop took 27446ms

私ははるかに速く、これを呼び出すことはありませんが、ええ、残念ながらフレームワークをストリーミングの現在の実装では、パフォーマンスとコードの明瞭さとの間にトレードオフがあります。

編集:ループの対マップについての議論に対処するために - それは型に線や文字の敬遠しがち番号に関するものではありません、多分私はまた、高階関数を持つ言語で甘やかさが、私のために変換するAとの間に精神的な切断が存在していますコレクション(何をマップするだけである)、その大きさとどのように取得する/アサイン要素の詳細に私の脳を置きます。また、Javaストリーミングフレームワークは年齢の後ろにまだあることを言及する価値があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=191018&siteId=1
おすすめ