3

我有一个对象集合,它们都是相同的对象类型。在该类型中,有一个我想要访问的属性 - 在这种情况下,它是将其添加到逗号分隔的列表中:

String sep = ", ";
List<Item> items = db.findItems();

for (Item item : items) 
{
    result.append(item.getDescription() + sep);
} //for

return result.substring(0, results.length - sep.length());

如果我可以直接从集合中的所有对象中访问该属性,那就太好了,这样我就可以调用 Google Guava 的 Joiner 函数:

return Joiner.on(", ").join(/*Description attribute collection here*/);

我正在考虑的那种结构就像一个二维数组,其中每一列代表一个属性,每一行代表一个对象,所以我希望能够调用返回对象的特定行或特定列(属性)它返回所有对象的属性集合。

Java 或优秀的第三方是否有这样的数据结构,或者我需要创建自己的数据结构吗?

干杯,

阿列克谢蓝。

4

4 回答 4

5

那你为什么不充分利用谷歌的番石榴呢?

Joiner.on(",").join(Collections2.transform(items, new Function<Item, String>() {
    public String apply(Item input) {
        return item.getDescription();
    }
}));
于 2012-05-10T12:19:51.387 回答
2

您可以编写一个内部Iterable子类,该子类可以触及集合中的每个对象并发出正确的属性。查看@Hiery 的回复,他更快地找到了代码......

于 2012-05-10T12:16:25.680 回答
2

即将在JDK 8中推出,带有 lambda 表达式和方法引用

List<Jedi> jedis = asList(new Jedi("Obiwan",80), new Jedi("Luke", 35));
List<String> jediNames = jedis.map(Jedi::getName).into(new ArrayList<>()); //with metdod ref
Iterable<Integer> jediAges = jedis.map(j -> j.getAge()); //with lambdas

根据您的操作,您甚至可以使用链接中提供的 JDK 8 预览版。

或者,Lambdaj库提供了一种方法来做到这一点。

于 2012-05-10T12:29:44.377 回答
0

傻,但我会选择 Item.toString()。不存在地图所以你可以加入(地图)吗?

于 2012-05-10T12:16:56.350 回答