是否可以使用Java Guava将函数应用于集合?

时间:2011-09-16 15:30:14

标签: java collections guava

我想使用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

4 个答案:

答案 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);

输出:

  

[赛车,棚车]

或者,如果您不需要ListCollection,则可以使用转换后的实时视图:

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函数的作用,如果您只更改CellTable<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中的行,列位置,您将保留一个“方形”表。