3

我有一个像这样的对象:

class House {

    String name;

    List<Door> doors;

}

我想要做的是将 a 转换List<House>List<Door>包含 all doorsof all的 a houses

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

我尝试使用番石榴使用 Lists.transform 函数,但我只得到一个List<List<Door>>结果。

4

3 回答 3

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();
    }
}
于 2012-12-18T17:25:14.887 回答
6
FluentIterable.from(listOfHouses).transformAndConcat(doorFunction)

会做得很好。

于 2012-12-18T17:20:05.500 回答
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.transformfor inputlist of houses和 transform 函数可以get all doors from a house为您提供正确的输出list of *each house's doors*(恰好是List<List<Door>>)。

更一般地说,你想要reduce/fold函数而不是转换,这在 Guava 中没有实现(参见这个问题),主要是因为 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
于 2012-12-18T16:50:23.130 回答