使用番石榴的Tables.toTable

时间:2018-09-21 13:31:37

标签: java guava

我有一个Thing列表,其中包含两个属性:status(一个枚举)和owner(另一个对象)。

我想通过遍历Table<owner, status, Long>并计数对象来获得番石榴ArrayList,如果某些状态不在列表中,则包括0的计数,例如:< / p>

[owner1, status1, 2], [owner1, status2, 0], [owner2, status1, 3], [owner2, status2, 2]

在这种情况下如何使用.collect(Tables.toTable())

2 个答案:

答案 0 :(得分:3)

以下代码将创建一个包含计数的表,但不包含零计数

List<Thing> listOfThings = ...;

Table<Owner, Status, Long> table = 
    listOfThings.stream().collect(
        Tables.toTable(
            Thing::getOwner,             // Row key extractor
            Thing::getStatus,            // Column key extractor
            thing -> 1,                  // Value converter (a single value counts '1')
            (count1, count2) -> count1 + count2, // Value merger (counts add up)
            HashBasedTable::create       // Table creator
        )
    );

要将缺失的像元添加到表中(具有零值),您将需要额外遍历所有可能的值(StatusOwner),并将0值放入如果还没有价值。请注意,如果Owner不是枚举,则没有简单的方法来获取其所有可能的值。

或者,替代执行此操作,只是在从表中检索值时检查null

答案 1 :(得分:2)

您需要为行,列,值,合并功能和表提供者提供映射器。像这样:

list.stream().collect(Tables.toTable(
               Thing::getStatus,
               Thing::getOwner,
               t -> 1, //that's your counter
               (i, j) -> i + j, //that's the incrementing function
               HashBasedTable::create //a new table
            ));