3

我有一个带有 Type 的数组B[]。我有一个构造函数A(B b)

我想A[]使用它们创建一个带有 Type 的数组。

我可以使用 for 语句来做到这一点,但我想知道是否有更方便(更短)的方式来做到这一点。(语言语法、静态方法或其他)

public class A {
    public A(B b) {
        A.a = B.a;
        A.b = B.b * B.c;
        ...
    }
}

public class B {
    ...
}

public class C {
    public static B[] getBs() {
        B[] bs;
        ...
        return bs;
    }
}

void process() {
    // From here
    B[] bs = C.getBs();
    A[] as = new A[bs.length];
    for (int i=0; i<bs.length; i++) {
        as[i] = new A(bs[i]);
    }
    // To here
}
4

3 回答 3

4

截至语言2的当前1状态,您能做的最好的事情是这样的3

interface Transformer<A, B> {
    B transform(A a);
}

class ArrayUtils {
    @SuppressWarnings("unchecked")
    public static <A, B> B[] transformArray(
        Class<B> clazz,
        A[] a,
        Transformer<A, B> transformer
    ) {
        B[] b = (B[])Array.newInstance(clazz, a.length);
        for(int i = 0; i < a.length; i++) {
            b[i] = transformer.transform(a[i]);
        }
        return b;
    }
}

用法:

Foo[] foos = // some Foo array
Bar[] bars = 
    ArrayUtils.transformArray(
        Bar.class,
        foos,
        new Transformer<Foo, Bar>() {
            public Bar transform(Foo foo) { return new Bar(foo); } 
        }
    );

这假设:

class Foo { }
class Bar { public Bar(Foo foo) { } }

1 : 2014 年推出的功能(?)将使其更容易。

2:记住男孩和女孩,下次你从头设计自己的类型系统时,记得尽早添加泛型,而不是以后添加它们

3:刚刚破解了这个。随时帮助修复任何错误。:-)

于 2013-08-09T03:55:33.240 回答
3

还没有。在Java 8中,得益于Project Lamda,我们将能够访问更多函数式编程特性,例如地图函数

在 Java 8 中,以下内容将是有效的:

B[] bs = C.getBs();
List<A> aList = Stream.of(bs).map(b -> new A(b)).collect(Collectors.toList());
A[] as = aList.toArray(new A[aList.size()]);

这使用了lamda 表达式,以及其他几个新功能12

虽然这可能不会“更短” ,但默认情况下会Stream提供并行化,因此如果您更改Stream.of(bs)Stream.of(bs).parallel()上述示例中的内容,它会在多核机器上处理大型阵列时表现得更好。

/edit
你也可以使用方法引用而不是 lambda 表达式:

map(A::new)代替map(b -> new A(b))

于 2013-08-09T03:49:06.593 回答
1

从 Java 7 开始,您已经使用了最短的循环:

for (int i = 0; i < bs.length; ++i) {
    as[i] = new A(bs[i]);
}

但是,如果您使用集合而不是数组,则可以使用“for each”:

for (B b: bs) {
    as.add(new A(b));
}

集合还将为您提供其他灵活性和快捷方式。

于 2013-08-09T04:19:54.413 回答