首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用流从两个对象列表中根据条件准备新列表

使用流从两个对象列表中根据条件准备新列表
EN

Stack Overflow用户
提问于 2022-01-27 17:34:22
回答 2查看 286关注 0票数 0

我正在使用spring引导应用程序,处理列表。

我有这样的课程:

代码语言:javascript
复制
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 =这是完整列表

代码语言:javascript
复制
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 =它是唯一的列表

代码语言:javascript
复制
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的最终列表如下:

代码语言:javascript
复制
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对象和它的列表,但它不能正常工作。

我需要下面的代码进入流

代码语言:javascript
复制
 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);
            }
          }
        }
EN

回答 2

Stack Overflow用户

发布于 2022-01-28 00:47:14

这个任务不适合于函数式编程,因为它需要mutation of the stream elements并包含side effects。这意味着您将使用所谓的impure functions

我建议你看看这个链接Difference between pure and impure function?

与其编写一个风格上功能齐全的解决方案不符合良好的实践,我将展示的实现比最初版本的嵌套for-循环更具有性能,而且在风格上也有部分功能。

首先,考虑从其中一个列表中创建一个具有ModelNumber号的key。它将把时间复杂度降低到线性时间。

然后,我们仍然需要迭代其中的一个列表。在这种情况下,命令式的方法是必要的,因为它允许避免使用不纯的灯。

代码语言:javascript
复制
    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);
        }
    }
代码语言:javascript
复制
    public static Map<String, List<FullData>> getFullDataMap(List<FullData> fullDataList) {
        return fullDataList.stream()
             .collect(Collectors.groupingBy(FullData::getModelNumber));
    }

希望能帮上忙。如果你有任何问题,可以自由提问。

票数 0
EN

Stack Overflow用户

发布于 2022-01-30 21:16:25

如果需要使用for重写上一个嵌套的stream循环,可以这样做:

代码语言:javascript
复制
List<FullData> finalFullData = sourceModelList.stream()
        .flatMap(myModel -> filteredFullDataList.stream()
                .filter(fullData -> myModel.getModelNumber().equals(fullData.getModelNumber()))
                .peek(fullData -> fullData.setPptTitle(myModel.getPptTitle())))
        .toList();

然后:

代码语言:javascript
复制
finalFullData.forEach(System.out::println);

输出:

代码语言:javascript
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70883151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档