java - 我如何映射 Java 中的数组?

标签 java arrays

我有一个字符串数组

String[] suffixes = getSuffixes();

我想要一个基于旧数组并附加前缀的新数组。我会在 Ruby、JavaScript、Perl、Lisp 等语言中做这样的事情:

// pseudocode for what I would like

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

我的应用程序中仅限于数组。 (这是学校作业的一小部分,我不允许使用 Collections 库。)在 Java 8 中有什么方法可以做到这一点?

最佳答案

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];
            }
        }
    }
}

运行(jdk 1.8.0_60):

$ 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

我不会说这个更快,但是,不幸的是,在当前的流式框架实现中,性能和代码清晰度之间存在权衡。

编辑:为了解决关于 map 与 for 循环的讨论——这与输入的行数或字符数无关,也许我也被具有高阶函数的语言宠坏了,但对我来说有一种精神上的脱节在转换集合(这就是 map 所做的)和让我的大脑深入了解其大小以及如何获取/分配元素的细节之间。 另外值得一提的是,Java 流框架仍然落后很多年。

关于java - 我如何映射 Java 中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52416381/

相关文章:

java - 简单的 'Make chocolate'逻辑和解决方案回顾

java - 没有引用的类会被编译吗?

arrays - Excel 数组求值和一些技巧

php - 有逗号时拆分数组值

javascript array - 什么是真正的表达?

java - Spring Maven 清理错误 - 请求的配置文件 "pom.xml"无法激活,因为它不存在

java - Android ImageButton不显示图像

java - XSLT 转换有时会失败

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

javascript - 用一组重量平衡秤