我有一个类型为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
}
答案 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年有哪些功能(?)可以让它变得更容易。
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 1,2 。
虽然这可能不会“更短”,但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));
}
收藏品还将为您提供其他灵活性和捷径。