加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何组合两个流?

发布时间:2020-12-15 08:27:24 所属栏目:Java 来源:网络整理
导读:我正在尝试学习/理解 java中的流并拥有这段代码: List Tag tags = (classA.getTags() != null ? classA.getTags() : new ArrayList());List Integer tagsIds = new ArrayList(Arrays.asList(1,2,3,4));ListInteger ids = tags.stream().map(Tag::getId).col
我正在尝试学习/理解 java中的流并拥有这段代码:

List <Tag> tags = (classA.getTags() != null ? classA.getTags() : new ArrayList<>());
List <Integer> tagsIds = new ArrayList<>(Arrays.asList(1,2,3,4));
List<Integer> ids = tags.stream().map(Tag::getId).collect(Collectors.toList());
tagIds.stream()
      .filter(tagId -> !ids.contains(tagId))
      .forEach(tagId -> {
         Tag tag = new Tag();
         tag.setId(tagId);
         tags.add(tag);
       });

请给我一个提示,告诉我如何将两个流组合成一个流?

——-已添加23.08.2018 ——–
如果我们摆脱ids变量,它将改善一点性能和下面的代码执行,因为我们使用Set< Integer> tagsIds,所以没有重复项(例如,如果tagIds包含值(5,6,7,8,5,7),它只能用于(5,8)).修改后的代码下面:

List <Tag> tags = (classA.getTags() != null ? classA.getTags() : new ArrayList<>());
List <Integer> tagIds = new ArrayList<>(Arrays.asList(5,7));
tagIds.stream()
      .filter(tagId -> !tags.stream().map(Tag::getId).collect(Collectors.toList()).contains(tagId))
      .forEach(tagId -> {
            Tag tag = new Tag();
            tag.setId(tagId);
            tags.add(tag);
       });

这种修改具有诸如读取和调试代码的复杂性之类的缺点

解决方法

List<Tag> combinedTags = Stream
        .concat( // combine streams
                tags.stream(),tagIds.stream().map(Tag::new) // assuming constructor with id parameter
        )
        .distinct() // get rid of duplicates assuming correctly implemented equals method in Tag
        .collect(Collectors.toList());

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读