zoukankan      html  css  js  c++  java
  • 删除list列表中的某一个元素的多种方法

      当我们在处理业务的时候,很多情况下数据都要进行一层层的过滤,最近需要给一个列表中去除不符合条件的元素,

    本来觉着挺简单的,Google了下发现很多方法都是旧方法,根本不符合我的需求。

    于是参考着网上的方法自己写了几个方法

    1 .Iterator 去除

    Iterator<AdmVipConfigs> iterator = admVipConfigs.iterator();
    while (iterator.hasNext()){
    AdmVipConfigs next = iterator.next();
    String vipName1 = next.getVipName();
    if (vipName1.equals("铂金会员")){
    iterator.remove();
    }
    }

    虽然也能去除  但是列表改造成 Iterator 类型的了  (还要转换  不喜欢 )

    这不太符合我的代码风格   先pass

    又换了几种比较旧的转换方式   发现缺陷都不小(麻烦)

    这时候不能再跟着旧思路走了 必须自己想个好方法了

    这时候突然就想起了流  虽然用的不多  但是很喜欢这种风格

    用流怎么处理这个问题呢

    不用说肯定先Google

    然后发现流确实能处理 而且更强大(好看)

    2 stream 去除

    admVipConfigs.stream().findFirst().map(vo -> {
    if (vo.getVipName().equals("注册会员")){
    admVipConfigs.remove(vo);
    }
    return vo;
    });
    没有改变我的list格式并且更简洁,看着还是比较满意的
    但是流处理的时候remove的时候会再次遍历整个list来找出
    这个元素,性能会有一定的损耗,这怎么能行,我肉眼能看到的
    损耗都是垃圾代码(除非没时间改)

    既然这样 我们只能给它加个索引了

    3 stream + 索引 去除

    IntStream.range(0,admVipConfigs.size()).filter(i->
    admVipConfigs.get(i).getVipName().equals("金卡会员")).
    boxed().findFirst().map(i->admVipConfigs.remove((int)i));

    其中boxed为装箱操作
    好像又简洁了点,没错 要的就是这个了!
     //  去除list中的某一个元素
        @Test
        public void bb(){
            String vipName[] = {"注册会员", "金卡会员", "铂金会员", "钻石会员", "至尊会员", "超级会员"};
    
            List<AdmVipConfigs> admVipConfigs=new ArrayList<>();
            for (int i = 1; i < 7; i++) {
                AdmVipConfigs admVipConfig = new AdmVipConfigs();
                admVipConfig.setVipId(i);
                admVipConfig.setVipDel(0);
                admVipConfig.setVipDefaultValue(0);
                admVipConfig.setVipOrderNo(i);
                if (i == 1) {
                    admVipConfig.setVipStatus(0);
                } else {
                    admVipConfig.setVipStatus(1);
                }
                admVipConfig.setVipCondition(0);
                admVipConfig.setVipName(vipName[i - 1]);
                admVipConfigs.add(admVipConfig);
            }
            admVipConfigs.stream().findFirst().map(vo -> {
                if (vo.getVipName().equals("注册会员")){
                    admVipConfigs.remove(vo);
                }
                return vo;
            });
            IntStream.range(0,admVipConfigs.size()).filter(i->
                admVipConfigs.get(i).getVipName().equals("金卡会员")).boxed().findFirst().map(i->admVipConfigs.remove((int)i));
    
            Iterator<AdmVipConfigs> iterator = admVipConfigs.iterator();
            while (iterator.hasNext()){
                AdmVipConfigs next = iterator.next();
                String vipName1 = next.getVipName();
                if (vipName1.equals("铂金会员")){
                    iterator.remove();
                }
            }
    
            System.out.println(admVipConfigs);
        }
    完整代码
  • 相关阅读:
    INF文件的语法解说转
    VC的拨号上网程序
    sql修复
    flash media server 2 下载 + 无限制序列号
    [原] ASPNET2.0中如何历遍GRIDVIEW
    [net2.0] ASPNET内置安全认证架构 的灵异问题~~~~
    SnagIt的Visual Studio Team System插件
    [翻译]使用HtmlAgilityPack更好的HTML分析和验证
    哪些自动化测试工具支持AJAX
    VSTT Rosario CTP
  • 原文地址:https://www.cnblogs.com/blogsofmy/p/10955171.html
Copyright © 2011-2022 走看看