使用类构造函数和另一个数组初始化数组

时间:2013-08-09 03:28:03

标签: java arrays constructor

我有一个类型为B[]的数组。我有一个构造函数A(B b)

我想使用类型A[]创建一个数组。

我可以使用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
}

3 个答案:

答案 0 :(得分: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 :记住男孩和女孩,the next time you design a type system of your own from scratch, remember to add generics early, rather than adding them on later

3 :刚刚一起攻击了这个。随意帮助修复任何错误。 : - )

答案 1 :(得分:3)

还没有。在Java 8中,由于functional programming,我们可以访问更多Project Lamda个功能,例如map functions

在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 expression和其他几个new features 12

虽然这可能不会“更短”,但Stream提供了parallelization by default,因此如果您在上面的示例中将Stream.of(bs)更改为Stream.of(bs).parallel(),则会执行

/编辑
您也可以使用method reference代替lambda表达式:

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

答案 2 :(得分: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));
}

收藏品还将为您提供其他灵活性和捷径。