【问题标题】:How to remove null bean attributes present in a List?如何删除列表中存在的空 bean 属性?
【发布时间】:2013-01-15 03:17:14
【问题描述】:

我正在使用 Spring-WS 填充 List<SomeBean> w.r.t。一个网络服务。我在使用该服务后获得的最终列表包含其某些属性的null 条目。例如,考虑以下MangaBean 列表,其中包含标题、作者和流派作为属性。

MangaBean [title=Bleach, author=Kubo Tite, genre=fantasy]
MangaBean [title=Naruto, author=Masashi Kishimoto, genre=action]
MangaBean [title=One Piece, author=Eiichiro Oda, genre=null]
MangaBean [title=Fairy Tail, author=Mashima Hiro, genre=null]
MangaBean [title=Rurouni Kenshin, author=Watsuki Nobuhiro, genre=Shounen]
MangaBean [title=Takamagahara, author=KAWAI Juuzou, genre=Supernatural]
MangaBean [title=Historys Strongest Disciple Kenichi, author=Matsuena Syun, genre=Martial arts]
MangaBean [title=Hajime no Ippo, author=Jyoji Morikawa, genre=null]

某些 bean 的 genre 条目是 null。我正在尝试删除列表中具有 null 属性 的对象。 我的问题是:

  1. 通过删除特定条目来更改原始列表是否正确/良好的做法?或者我应该填充另一个列表 w.r.t.上一个列表?
  2. 如果我应该更改列表并删除那些空条目,我应该怎么做?

我尝试了this,但它失败了,因为对象引用本身不为空。我尝试了传统的 for 循环,但它无法删除具有空属性的附属对象。访问列表时无法使用增强的 for-loop 删除项目。请给我一些大脑。 :)

【问题讨论】:

    标签: java list collections


    【解决方案1】:

    您可以使用迭代器并手动删除具有空类型的迭代器:

    for (Iterator<MangaBean> it = mangas.iterator(); it.hasNext();) {
        if (it.next().getGenre() == null) { 
            it.remove(); 
        }
    }
    

    或者您可以使用一些常用库过滤列表,例如 Apache Commons CollectionUtils 或 Guava Iterables.filter()

    // apache commons
    mangas = CollectionUtils.filter(mangas, new Predicate() {
        @Override public boolean evaluate(Object object) {
            return ((Manga) manga).getGenre() != null;
        }
    });
    
    // Guava 
    Iterables.filter(mangas, new Predicate<Manga>() {
        @Override public boolean apply(Manga m) {
            return manga.getGenre() != null;
        }
    });
    

    【讨论】:

      【解决方案2】:

      List 中删除没有什么不好的做法,除非您不能相信List 的来源可以为您提供可变引用。

      如果它是可变的(不是只读的),那么你可以使用Iterator:

      List<MangaBean> list = ...;
      Iterator<MangaBean> iterator = list.iterator();
      
      while (iterator.hasNext())
      {
          MangaBean bean = iterator.next();
      
          if ( ! isValidMangaBean(bean))
          {
              iterator.remove();
          }
      }
      

      限制表现为从List 中删除如果它是只读的List。通过创建仅包含非null 元素的副本,您可以保证不会遇到任何障碍,但如果List 不是只读的,则使用上述Iterator 将起作用。

      List<MangaBean> list = ...;
      List<MangaBean> cleaned = new ArrayList<MangaBean>();
      
      for (MangaBean bean : list)
      {
          if (isValidMangaBean(bean))
          {
              cleaned.add(bean);
          }
      }
      

      可以扩展的参考函数:

      boolean isValidMangaBean(MangaBean bean)
      {
          return bean.getGenre() != null;
      }
      

      如果您不断遇到上述情况,请考虑编写一个Filter interface,让您可以更通用地执行上述过滤。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-08
        • 2021-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        相关资源
        最近更新 更多