我有一个像这样的对象:
class House {
String name;
List<Door> doors;
}
我想要做的是将List<House>
转换为包含所有List<Door>
doors
houses
的{{1}}。
有没有机会用番石榴做到这一点?
我尝试使用guava使用Lists.transform函数,但我只得到一个List<List<Door>>
。
答案 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