我正在使用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属性的对象。
我的问题是:
我试过this但它失败了,因为对象引用本身不为空。我尝试了传统的for循环但它无法删除具有null属性的辅助对象。在访问列表时,无法使用增强型循环来删除项目。请给我一些大脑。 :)
答案 0 :(得分:3)
您可以使用Iterator并手动删除具有空类型的Iterator:
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;
}
});
答案 1 :(得分: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
元素的副本,您可以保证不会遇到任何障碍,但如果未读取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
,以便您更加通用地执行上述过滤。