2017-09-20 8 views
0

私はオブジェクトのリストを持っていますが、オブジェクトのリストがもう一つあります。両方のオブジェクトは同じではなく、一般的にはあまり関係がありませんただし、1つのプロパティを共有する点を除き、一致した場合には同じプロパティを使用します。私は、他のリストから1つのリストの項目を除外したいと思います。他のオブジェクトのリストに基づくオブジェクトのリストからJava 8のフィルタオブジェクトが外されている

例: オブジェクトAppleにはStringプロパティの名前とブール値isOrderedがあります。 オブジェクトフルーツ:文字列プロパティを持ちます。名前とブール値を使用できます。

セイのArrayListリンゴは、名前がfuji、pink lady、およびArrayListのフルーツ、fuji、pink lady、gala、williams、

結果リストには、ガラ、ウィリアムズ、umeを含む果物のリストがあります。

これはループで達成することができ、古いJavaメソッドで

:hasEntryは、データベースからすべてのりんごを取得し、リストをループまたは直接データベース内fruitnameを探してされているいずれかで

for (Fruit fruit: fruits) { 
    if (!hasEntry(apples, fruit.getName())) { 
    result.add(fruit) 
    } 
} 

。どちらの方法も遅いです。

オブジェクトが同じ場合は、単にfruits.removeAll(リンゴ)を使用できます。 java 8 list.filterは、自分のリストのオブジェクトであれば、別のものではなくプロパティをチェックするためにも機能しているようです。

フィルタは、異なるオブジェクトを持つ2つのリストでも使用できますか?

答えて

0

データベースアクセスに関する問題とよく似ています。あなたの方法hasEntryはおそらくdsからリンゴを取り出し、それをフルーツ名と比較します。これはすべての果実のために反復され、非効率的です。

これを解決する1つの方法は、リンゴを一時フィールドに格納して比較することです。また、リンゴを検索し、フルーツ名と比較するのに使用できる名前を持つHashSet<String>を作成することもできます。

HashSet#containsのアクセス時間はO(1)です。

何か

List<Fruits> newFruits = fruits.stream().filter(e -> !hashSet.contains(e.getName())).collect(Collectors.toList()); 
+0

HashSetのは良い方法のように見えるように、私は抽出のために、データベースからリンゴのリストからすべての名前をストリームマップ機能を使用することができます。 これを実行する方法もありますか? – kumoyadori

+0

@kumoyadori私の編集を参照してください。そんな感じ –

関連する問題