2

我正在使用 Spring-WS 来填充List<SomeBean>一个 web 服务。我在使用该服务后获得的最终列表包含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. 我正在尝试删除列表中具有空属性的对象。我的问题是:

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

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

4

2 回答 2

3

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

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;
    }
});
于 2013-01-31T05:03:24.860 回答
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 if它是只读的中删除List。通过创建仅包含非null元素的副本,您可以保证不会遇到任何障碍,但如果不是只读的,则使用上述方法Iterator将起作用。List

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可以让您更通用地执行上述过滤的方法。

于 2013-01-31T05:05:20.550 回答