将List <string>转换为List <myobject>,其中MyObject包含表示顺序的int </myobject> </string>

时间:2011-09-16 17:09:42

标签: java design-patterns

是否存在模式,或内置功能我缺少或我应该像这样循环

public List<MyObject> convert(List<String> myStrings){

    List<MyObject> myObjects = new ArrayList<MyObject>(myStrings.size());

    Integer i = 0;
    for(String string : myStrings){
        MyObject myObject = new myObject(i, string);
        myObjects.add(object);
        i++;
    }
    return myObjects;
}

因为我需要将列表保存到数据库并保留顺序。

4 个答案:

答案 0 :(得分:8)

您可以使用Guava

List<MyObject> myObjects = Lists.transform(myStrings,
   new Function<String, MyObject>() {
       private int i = 0;
       public MyObject apply(String stringValue) {
           return new MyObject(i++, stringValue);
       }
   });

实际上它只是将迭代带入了库中。就编写的实际代码而言,在Java 8引入闭包之前它将大致相同。

但是,您应该知道将函数设置为有状态(使用i)是不好的形式,因为现在它应用于列表的顺序很重要。

答案 1 :(得分:1)

Java 8中的闭包和lambda应该允许Java使用Mapper和Reducer函数(如MapReduce)。事实上,如果您关注Project Lambda的最新发展,您会看到很多样本lambda代码在集合上运行。

e.g。

Collections.sort(people, 
                 #{ Person x, Person y -> x.getLastName().compareTo(y.getLastName()) });

但在此之前,您在问题中发布的代码应该足够了。

答案 2 :(得分:0)

您的代码可以正常运行。如果你使用groovy它会更清洁,因为你可以做类似的事情:

def i = 0;
def myObjects = myStrings.collect {str -> new MyObject(i++, str);}

或者像马克彼得的代码那样的番石榴。但是,如果您不想切换语言或导入新库,那么您的代码就完全可以了。

答案 3 :(得分:0)

我将回应上面的glowcoder的评论,并想知道为什么你需要转换List - 根据定义有订购信息 - 而不是简单地直接将数据保存到数据库。

那就是说,我仍然会提供一个简洁的代码片段:

for (final String string : myStrings) {
    myObjects.add(new MyObject(myObjects.size(), string));
}