我正在使用spring引导应用程序,处理列表。
我有这样的课程:
public class MyModel {
private String pptId;
private String pptTitle;
private String modelNumber;
}
public class FullData {
private String pptTitle;
private String modelNumber;
private String pptDetails;
private String price;
...............
..............
}列表sourceModelList =这是完整列表
MyModel(1,'ppt1','a1')
MyModel(1,'ppt1','a2')
MyModel(2,'ppt2','a1')
MyModel(2,'ppt2','a3')
MyModel(2,'ppt2','a4')
MyModel(3,'ppt3','a1')
MyModel(3,'ppt3','a3')
MyModel(3,'ppt3','a5')我已经过滤了FullData列表,但这是从某些处理中筛选出来的。
列表filteredFullDataList =它是唯一的列表
FullData(null,'a1','pptDetails1','300')
FullData(null,,'a2','pptDetails21','70')
FullData(null,,'a4','pptDetails41','10')
FullData(null,'a5','pptDetails13','45')现在,我需要按照sourceArticleList,中的顺序设置标题和准备列表,只需要删除不存在的modelNumber,它在filteredFullDataList中不作为a3存在。但我需要重复的模型,因为他们是在另一个ppt。
我们需要FullData的最终列表如下:
FullData('ppt1','a1','pptDetails1','300')
FullData('ppt1',,'a2','pptDetails21','70')
FullData('ppt2','a1','pptDetails1','300')
FullData('ppt2','a4','pptDetails41','10')
FullData('ppt3','a1','pptDetails1','300')
FullData('ppt5','a5','pptDetails13','45')我尝试过流,并通过幻灯片处理,然后准备FullData对象和它的列表,但它不能正常工作。
我需要下面的代码进入流
List<FullData> finalFullData = new ArrayList();
for (MyModel myModel : sourceModelList) {
for (FullData fullData : filteredFullDataList) {
if (myModel.getModelNumber().equals(fullData.getModelNumber())) {
fullData.setPptTitle(myModel.setPptTitle());
finalFullData.add(fullData);
}
}
}发布于 2022-01-28 00:47:14
这个任务不适合于函数式编程,因为它需要mutation of the stream elements并包含side effects。这意味着您将使用所谓的impure functions。
我建议你看看这个链接Difference between pure and impure function?
与其编写一个风格上功能齐全的解决方案不符合良好的实践,我将展示的实现比最初版本的嵌套for-循环更具有性能,而且在风格上也有部分功能。
首先,考虑从其中一个列表中创建一个具有ModelNumber号的key。它将把时间复杂度降低到线性时间。
然后,我们仍然需要迭代其中的一个列表。在这种情况下,命令式的方法是必要的,因为它允许避免使用不纯的灯。
public static void main(String[] args) {
List<MyModel> sourceModelList = getSourceModelList();
List<FullData> filteredFullDataList = getFilteredFullDataList();
Map<String, List<FullData>> modelNumberToFullData = getFullDataMap(filteredFullDataList);
Set<String> seen = new HashSet<>(); // stores modelNumbers that are already processed
List<FullData> finalFullData = new ArrayList();
for (MyModel myModel : sourceModelList) {
String modelNumber = myModel.getModelNumber();
if (seen.contains(modelNumber) || !modelNumberToFullData.containsKey(modelNumberToFullData))
continue;
for (FullData data: modelNumberToFullData.get(modelNumber)) {
data.setPptTitle(myModel.getPptTitle());
finalFullData.add(data);
}
seen.add(modelNumber);
}
} public static Map<String, List<FullData>> getFullDataMap(List<FullData> fullDataList) {
return fullDataList.stream()
.collect(Collectors.groupingBy(FullData::getModelNumber));
}希望能帮上忙。如果你有任何问题,可以自由提问。
发布于 2022-01-30 21:16:25
如果需要使用for重写上一个嵌套的stream循环,可以这样做:
List<FullData> finalFullData = sourceModelList.stream()
.flatMap(myModel -> filteredFullDataList.stream()
.filter(fullData -> myModel.getModelNumber().equals(fullData.getModelNumber()))
.peek(fullData -> fullData.setPptTitle(myModel.getPptTitle())))
.toList();然后:
finalFullData.forEach(System.out::println);输出:
FullData[ppt3,a1,pptDetails1,300]
FullData[ppt1,a2,pptDetails21,70]
FullData[ppt3,a1,pptDetails1,300]
FullData[ppt2,a4,pptDetails41,10]
FullData[ppt3,a1,pptDetails1,300]
FullData[ppt3,a5,pptDetails13,45]https://stackoverflow.com/questions/70883151
复制相似问题