如何在Java 8中从对象列表设置类属性

4

我有一个PageSummary对象的ArrayList,我想使用Java 8将列表对象的值设置到我的Model类属性中。

public class XXXX {
for(PageSummary ps : pageSummaryList){
model = new Model();
model.setName(ps.getName());
model.setContent(getContent(ps.getName()));
model.setRating(getAverageRating(ps.getName()));
modelList.add(model);
}                   

private String getContent(String sopName){} 

private AverageRatingModel getAverageRating(String sopName){}
}

这里的getAverageRating函数会返回一个介于1-5之间的整数,而getContent函数则会返回一个字符串。


9
我修改了你的代码,使其更易于阅读。你有什么问题吗?你的代码似乎已经实现了你想要的功能。 - Tunaki
我的问题是将其转换为Java 8。 public class XXXX { for(PageSummary ps : pageSummaryList){ model = new Model(); model.setName(ps.getName()); model.setContent(getContent(ps.getName())); model.setRating(getAverageRating(ps.getName())); modelList.add(model); } private String getContent(String sopName){} private AverageRatingModel getAverageRating(String sopName){} } - Pawan Kumar
2个回答

3

3

首先,您应该创建一个带有PageSummary参数的Model构造函数。

public Model(PageSummary ps) {
    this.setSopName(ps.getName());
    this.setSopContent(getContent(ps.getName(), clientCode, context, httpcliet));
    this.setAverageRating(getAverageRating(ps.getName(), clientCode, context, httpclient));
}

感谢这个,你可以缩短循环:
for (PageSummary ps : pageSummaryList) {
    ModelList.add(new Model(ps));
}

并轻松使用Stream API:

// This solution is thread-safe only if ModelList is thread-safe
// Be careful when parallelizing  :)
pageSummaryList.stream().map(Model::new).forEach(ModelList::add);

或者

// A thread-safe solution using Stream::collect()
List<Model> models = pageSummaryList.stream()
                                    .parallel() // optional :)
                                    .map(Model::new)
                                    .collect(Collectors.toList());
ModelList::addAll(models); // I suppose you don't need us to implements this one!

感谢Alexis C.指出,在并行化的情况下使用collect方法可以避免并发问题 :)


2
我认为你应该使用“collect”方法。只要将流并行化,而且“ModelList”不是线程安全的,就会遇到并发问题。 - Alexis C.
在这里,我有两个本地方法getContent和getAverageRating。我应该通过引用或其他方式在Model类中访问这些方法吗? - Pawan Kumar
@PawanSharma 嗯,没有代码很难说,但是你可以将引用传递到“Model”的构造函数中(并用lambda替换“Model :: new”),或者使这些方法成为“静态的”。 - NiziL
@PawanSharma 抱歉,我在谈论 getContentgetAverageRating 的代码 ^^ 此外,您不必在评论中发布它,请编辑您的问题 :) - NiziL
getAverageRating函数返回1-5之间的整数,而getContent函数返回字符串。 - Pawan Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接