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です。リスト内のnullプロパティを持つオブジェクトを削除しようとしています。私の質問は次のとおりです。

  1. 特定のエントリを削除して元のリストを変更することは適切/適切な方法ですか?または、前のリストに別のリストを追加する必要がありますか?
  2. リストを変更してそれらのnullエントリを削除する必要がある場合、どのようにすればよいですか?

これを試しましたが、object-ref自体がnullではないため失敗します。従来のforループを試しましたが、nullプロパティを持つ隣接オブジェクトを削除できません。リストへのアクセス中にアイテムを削除するためにenhanced-for-loopを使用することはできません。親切に私に脳を与えてください。:)

4

2 に答える 2

3

Iterator を使用して、null ジャンルを持つものを手動で削除できます。

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のソースが変更可能な参照を提供することを信頼できない場合を除き、a から削除することは悪い習慣ではありません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、上記のフィルタリングをより一般的に実行できる を作成することを検討してください。

于 2013-01-31T05:05:20.550 に答える