如何将具有列表属性的对象列表转换为包含所有列表属性迭代的列表

时间:2012-12-18 16:01:54

标签: java guava

我有一个像这样的对象:

class House {

    String name;

    List<Door> doors;

}

我想要做的是将List<House>转换为包含所有List<Door> doors houses的{​​{1}}。

有没有机会用番石榴做到这一点?

我尝试使用guava使用Lists.transform函数,但我只得到一个List<List<Door>>

3 个答案:

答案 0 :(得分:9)

如果您确实需要使用功能方法,可以使用FluentIterable#transformAndConcat

执行此操作
public static ImmutableList<Door> foo(List<House> houses) {
    return FluentIterable
            .from(houses)
            .transformAndConcat(GetDoorsFunction.INSTANCE)
            .toImmutableList();
}

private enum GetDoorsFunction implements Function<House, List<Door>> {
    INSTANCE;

    @Override
    public List<Door> apply(House input) {
        return input.getDoors();
    }
}

答案 1 :(得分:6)

FluentIterable.from(listOfHouses).transformAndConcat(doorFunction)

会做得很好。

答案 2 :(得分:0)

你不需要番石榴(假设我理解正确):

final List<Door> doorsFromAllHouses = Lists.newArrayList();
for (final House house : houses) {
  doorsFromAllHouses.addAll(house.doors);
}
// and doorsFromAllHouses is full of all kinds of doors from various houses

使用Lists.transform输入list of houses和转化函数get all doors from a house可以正确输出list of *each house's doors*(正是List<List<Door>>)。

更一般地说,你需要reduce / fold function而不是变换,这在Guava(see this issue)中没有实现,主要是因为Java的详细语法和for-each循环的存在是足够好的。您将能够减少Java 8(或者您现在可以使用任何其他主流语言执行此操作......)。伪Java8代码:

List<Door> doors = reduce(
  houses,                                  // collection to reduce from
  new ArrayList<Door>(),                   // initial accumulator value
  house, acc -> acc.addAll(house.doors));  // reducing function