Java 一种关于集合访问器转换的模式

Java 一种关于集合访问器转换的模式,java,design-patterns,Java,Design Patterns,如何调用此模式,是否存在用于此模式的现有apache commons实用程序: class Person { String getName(); } List<Person> persons = ...; // create a dynamic bean on the fly, which can be used as: Object personXxxx = transformListOfBeans(Person.class, persons); // so each

如何调用此模式,是否存在用于此模式的现有apache commons实用程序:

class Person {
    String getName();
}

List<Person> persons = ...;

// create a dynamic bean on the fly, which can be used as:
Object personXxxx = transformListOfBeans(Person.class, persons);
// so each of the bean properties now returns the list of the original property:
List<String> personNames = personXxxx.name;

// i.e. the transformation creates a new "type":
class PersonXxxx {
    List<String> getName();
}

这没问题。我想知道这样的模式是否已经为人所知,这样我就不必自己选择合适的词了。

我认为没有一个工具可以做到这一点。 您必须对其进行编码:

List<String> names = new ArrayList<String>(persons.size());
for (Person person : persons) {
    names.add(person.getName());
}
List name=new ArrayList(persons.size());
用于(人:人){
name.add(person.getName());
}

也许你可以使用内省来更一般化,但代码非常简单。

一种可能性是为所有方法声明一个接口,例如(为了清楚起见,前面的I)不可编辑、可编辑、可编辑等。将列表转换为列表。显然这有问题

我不认为有这样的模式,但番石榴提供了一种简单的方式将一个集合转换为另一个集合。例如:

List<Person> persons = ...;
Iterable<String> names = Iterables.transform(persons, new Function<Person, String>() {
    @Override
    public String apply(Person person) {
        return person.getName();
    }
});
列出人员=。。。;
Iterable name=Iterables.transform(persons,new Function(){
@凌驾
公共字符串应用(个人){
返回person.getName();
}
});

我认为这种解释是不够的。你能再详细一点吗?我想他想要的不是一张名单,而是一张名单,一张名单,一张他们的名字,一张名单,一张他们的年龄等等。我不知道一个好的,通用的方法来做这件事。你是想在运行中生成一个bean或类吗?@gurung:我更喜欢创建一张地图,上面有“name”,“age”等键。但这只是一个实现。是的,代码很简单。我想为Xxxx等取一个好词。对不起,我不知道名字。这并不能解决任何问题,所以它不是一个模式:模式是从问题中产生的。它确实是。所以你不必每次都收集清单。只要改变它,你就会得到一切。您可以在Html列表框中显示person.name的列表,而无需自己创建和填充列表。在JSP中,您总是使用foreach和println,但在JSF中,您需要一个
列表
来绑定
。是的,但您不必将其存储在对象中并尝试为该对象命名。您只需将其存储在变量中并将变量传递给视图。如果需要优化,请将名称列表放在缓存中。尝试将所有内容作为设计模式进行匹配是一种疾病。设计模式仅对高级设计有用。。。对于频繁出现的问题,开发人员可以通过不必重新解释解决方案模式来编写一些新词汇表来节省时间。很好。我可能会为大多数常见情况创建一些静态方法或枚举。
List<Person> persons = ...;
Iterable<String> names = Iterables.transform(persons, new Function<Person, String>() {
    @Override
    public String apply(Person person) {
        return person.getName();
    }
});