我有一个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())
?
答案 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
)
);
要将缺失的像元添加到表中(具有零值),您将需要额外遍历所有可能的值(Status
和Owner
),并将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
));