Java中是否有一种简单的方法(不涉及编写for循环)从另一个不同对象数组的属性创建对象数组?
例如,如果我有一个A
类型的对象数组,定义为:
public class A {
private String p;
public getP() {
return p;
}
}
我想创建一个字符串数组,其中包含每个A[i].p
的{{1}}值。
基本上,我想要这样做:Creating an array from properties of objects in another array,但是用Java。
我尝试使用i
和lambda表达式,但这似乎不起作用。我尝试了什么:
Arrays.copyOf(U[] original, int newLength, Class<? extends T[]> newType)
答案 0 :(得分:4)
使用Java 8,您可以使用Stream
API,尤其是map
函数:
A[] as = { new A("foo"), new A("bar"), new A("blub") };
String[] ps = Stream.of(as).map(A::getP).toArray(String[]::new);
此处,A::getP
和String[]::new
是方法/构造函数引用。如果您没有合适的方法来处理您想要的属性,您还可以使用lambda函数:
String[] ps = Stream.of(as).map(a -> a.getP()).toArray(String[]::new);
答案 1 :(得分:1)
这就是函数式编程map
中强大的概念非常有用的地方。以下是map
的定义方式:
map :: (a -> b) -> [a] -> [b]
因此,map
是一个函数,它接受一个函数(需要a
并返回b
)和一个列表并返回一个列表。它将给定函数应用于给定列表的每个元素。因此map
是高阶函数。
在Java 8中,如果可以将数组转换为流,则可以使用此 idiom 。这可以简单地完成:
Arrays.stream(array).map(mappingFunction);
其中mappingFunction从流中获取一个元素(比如类型A
)并将其转换为另一个元素(比如类型B
)。您现在拥有的是B
的流,您可以在收集器(例如列表或数组)中轻松collect
进行进一步处理。