是否存在模式,或内置功能我缺少或我应该像这样循环
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;
}
因为我需要将列表保存到数据库并保留顺序。
答案 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));
}