我有一个像这样的对象:
class House {
String name;
List<Door> doors;
}
我想要做的是将 a 转换List<House>
为List<Door>
包含 all doors
of all的 a houses
。
有没有机会用番石榴做到这一点?
我尝试使用番石榴使用 Lists.transform 函数,但我只得到一个List<List<Door>>
结果。
如果你真的需要使用函数式方法,你可以使用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();
}
}
FluentIterable.from(listOfHouses).transformAndConcat(doorFunction)
会做得很好。
你不需要番石榴(假设我理解正确):
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
for 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