Java:从另一个数组的属性创建一个数组

时间:2016-05-12 16:00:11

标签: java arrays

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)

2 个答案:

答案 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::getPString[]::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进行进一步处理。