如何在Java中映射数组?

如何在Java中映射数组?,java,arrays,Java,Arrays,我有一个字符串数组 String[] suffixes = getSuffixes(); 我想要一个新的数组,它是在旧数组的基础上加上前缀的。我会在Ruby、JavaScript、Perl、Lisp等语言中执行类似的操作: // pseudocode for what I would like String[] full_words = suffixes.map(suffix => "re" + suffix); 我的应用程序中仅限于阵列。(这只是学校作业的一小部分,我不允许使用集合

我有一个字符串数组

String[] suffixes = getSuffixes();
我想要一个新的数组,它是在旧数组的基础上加上前缀的。我会在Ruby、JavaScript、Perl、Lisp等语言中执行类似的操作:

// pseudocode for what I would like

String[] full_words = suffixes.map(suffix => "re" + suffix);
我的应用程序中仅限于阵列。(这只是学校作业的一小部分,我不允许使用集合库。)有没有办法在Java8中做到这一点

String [] full_suffixes = Arrays.stream(suffixes)
                          .map(suffix -> "re" + suffix)
                          .toArray(size -> new String[size])
“ol’Styled”循环太冗长:

String [] full_suffixes = new String[suffixes.length];
for(int i = 0; i < suffixes.length; i++) {
    full_suffixes[i] = "re" + suffixes[i];
}
我不认为这要快得多,但不幸的是,在当前的流框架实现中,在性能和代码清晰性之间存在着权衡

编辑:为了解决关于map vs for loops的讨论-这不是关于要键入的行数或字符数的问题,也许我也被具有高阶函数的语言所宠坏了,但对我来说,转换集合(这就是map所做的)之间存在着心理上的脱节把我的大脑放在它的大小和如何获取/分配元素的细节上。
同样值得一提的是,Java流媒体框架仍然落后。

一个好的ol'老式循环有什么问题?@ScaryWombat在查看了太多的
循环后,如果映射更合适的话,我内心的某些东西一想到要为
再键入一个
,就会退缩……)在列表上映射感觉更好。它更简洁,更容易阅读,等等(我来自Lisp/Scheme背景。)Ashton,我听说你来自哪里,但对你的代码施加限制的不是我,如果是我,我一开始就不会使用数组。是的,我也是。见鬼,我从一开始就不会使用Java-D这其中很大一部分是好奇心。它仍然足够快,满足我的需要!:)我很欣赏关于CPU开销的评论。如果我在编写生产Java,我会记住这一点。然而,这是一个学校项目,我正在尝试探索这门语言。更不用说“ol’Styled”循环是如何太快了。永远不要做旧霉简单和高性能的事情时,有一个性感的新死狗慢解决方案可用
.map(“re”::concat).toArray(String[]::new)
鉴于您代表溪流的布道,@khachik,我愿意承认我的批评可能有点太苛刻了。溪流比较慢,是的,但可能没有那么慢。今后我会尽量少恨他们一点,但我拒绝放弃把“好的ol`loop”作为我的第一选择。@KevinAnderson上帝保佑我不要传播任何东西,尤其是与Java相关的东西。
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];
            }
        }
    }
}
$ 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