我有一個對象,如:如何與列表屬性與所有列表轉換對象列表,一個列表屬性itemes包含
class House {
String name;
List<Door> doors;
}
我想要做的就是等轉換一個List<House>
到List<Door>
包含的所有doors
全部爲houses
。
有沒有機會用番石榴做到這一點?
我嘗試使用番石榴使用Lists.transform函數,但我只得到List<List<Door>>
作爲結果。
我有一個對象,如:如何與列表屬性與所有列表轉換對象列表,一個列表屬性itemes包含
class House {
String name;
List<Door> doors;
}
我想要做的就是等轉換一個List<House>
到List<Door>
包含的所有doors
全部爲houses
。
有沒有機會用番石榴做到這一點?
我嘗試使用番石榴使用Lists.transform函數,但我只得到List<List<Door>>
作爲結果。
你不需要番石榴它(假設我理解正確的你):
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
FluentIterable.from(listOfHouses).transformAndConcat(doorFunction)
會做的工作就好了。
如果你確實需要使用的功能的方法,你可以使用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();
}
}