3

次のようなオブジェクトがあります。

class House {

    String name;

    List<Door> doors;

}

私がやりたいことは、List<House>aList<Door>を all doorsof allを含む に変換すること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

Guava は必要ありません (私があなたを正しく理解していると仮定して):

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>>)。

より一般的には、Guava では実装されていない変換の代わりにreduce/ foldfunctionが必要です(この問題を参照)。これは主に、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 に答える