我想使用Guava将函数应用于集合,贴图等。
基本上,我需要分别调整Table
的行和列的大小,以便所有行和列的大小相同,执行以下操作:
Table<Integer, Integer, Cell> table = HashBasedTable.create();
Maps.transformValues(table.columnMap(), new ResizeFunction(BlockDimension.WIDTH));
Maps.transformValues(table.rowMap(), new ResizeFunction(BlockDimension.HEIGHT));
public interface Cell {
int getSize(BlockDimension dimension);
void setSize(BlockDimension dimension);
}
我已经知道ResizeFunction
应该是什么。但是,我需要应用,而不仅仅是返回Collection
。
答案 0 :(得分:13)
在Guava中,您不会转换现有列表,而是使用Iterables.transform创建一个新列表:
final List<String> list = Arrays.asList("race", "box");
final List<String> transformed =
Lists.newArrayList(Iterables.transform(list, new Function<String, String>() {
@Override
public String apply(final String input) {
return new StringBuilder().append(input).append("car").toString();
}
}));
System.out.println(transformed);
输出:
[赛车,棚车]
或者,如果您不需要List
和Collection
,则可以使用转换后的实时视图:
final Collection<String> transformed =
Collections2.transform(list, new Function<String, String>() {
@Override
public String apply(final String input) {
return new StringBuilder().append(input).append("car").toString();
}
});
此Collection
是基础视图的实时视图,因此list
的更改将反映在此Collection
中。
答案 1 :(得分:3)
如何创建这样的函数:
public static <T> void apply(Iterable<T> iterable, Function<T, Void> function) {
for (T input : iterable)
function.apply(input);
}
答案 2 :(得分:1)
Sean已经提到Guava不会更改原始集合,因此您无法在现有集合中“应用”某个功能。
目前尚不清楚ResizeFunction
函数的作用,如果您只更改Cell
中Table<Integer, Integer, Cell>
的值,那么您可以使用Tables#transformValues()
Guava不允许您更改R
(标准C
类)中Table<R, C, V>
和Tables
的值,因为这些值在返回行时用作键或列映射(Table#rowMap()
和Table#columnMap()
)并且您无法转换它们,因为所有用于转换和过滤的Guava方法都会产生延迟结果意味着函数/谓词仅在需要时应用,因为使用了对象。他们不创建副本。因此,转换很容易打破Set的要求。
如果您仍想这样做,那么您可以将Table
对象包装在您自己的类中并提供所需的方法。
答案 3 :(得分:0)
我认为在种群之前将表设置为合适的大小/具有适当数量的单元格会更好,即使它们是空的。类似的东西:
for (int i=0; i<numRows; i++)
for (int j=0; j<numColumns; j++)
table.put(i,j,null);
这将确保表格中的每个位置都有一个单元格。只要您只将单元格添加到numRows,numColumns中的行,列位置,您将保留一个“方形”表。