3

次のフィールドを持つVO従業員がいるとします。

従業員

EmployeeId
EmployeeName
EmployeeDOB
EmployeeAddress

私は従業員 VO のリストを持っています。たとえば、EmployeeList とします。
EmployeeList 内のすべての EmployeeIds の別のリストを作成したいと考えています。
最も一般的な方法は、EmployeeList を反復処理して EmployeeIdList に 1 つずつ追加することですが、シングル ショットでそれを行う方法はありますか?
これが現在のコードです。

List<Employee> employeeList = new ArrayList<Employee>();
populate(employeeList); //this will add EmployeeVOs to the list
List<String> employeeIdList = new ArrayList<String>();
for(Employee emp:employeeList)
{
 employeeIdList.add(emp.getEmployeeId()) ;
}

上記のように、employeeList を繰り返さずにすべての employeeIds を追加する方法があるかどうかを知りたいです。
EJB で発生し、他の多くのクラスでも使用されているため、既存の populate メソッドを変更したくありません。

4

5 に答える 5

4

LambdaJ を試してください:

List<String> employeeIds = extract(employeeList,on(Employee.class).getEmployeeId());

私はしばらくこのプロジェクトを使用してきましたが、少し学習曲線がありますが、本当に感謝しています.

これらのメソッド呼び出し (extractおよびon) はクラスの静的メソッドであるLambdaため、そのクラスで静的インポートを実行して、コードがきれいに見えることに注意してください。

于 2013-06-07T09:51:12.787 に答える
3

ID をキーとしてMapを使用できます。この方法では、1 つのコレクションがありpopulate(employeeList)、1 回の繰り返しで両方を追加できます。あなたが望むもの(idワンライナーを追加する)は、Java8のラムダの仕事のように聞こえます。

于 2013-06-07T09:48:09.290 に答える
2

さて、オリジナルを反復せずにオリジナルに変換する方法があります。私のアプローチは通常、Guava Collectionsフレームワークを使用しています。List<Employee>List<String>

List<Employee> employeeList = new ArrayList<Employee>();
populate(employeeList);
List<String> employeeIdList = Lists.transform(employeeList, new Function<Employee, String>() {
     public String apply(Employee input) {
         Preconditions.checkNotNull(input);
         return input.getEmployeeId();
     }
});

Guava はその時点ではまだ元のリストを反復処理せず、それを別の別のリストにラップし、要素がアクセスされたときにオンザフライで変換を実行します。問題は、結果リストで追加/挿入を実行できず、ある時点でそれを反復処理する必要があることです。

于 2013-06-07T09:50:20.437 に答える
0

私の知る限り、ありません。

しかし、2つのこと。VOリストを作成すると同時にIDリストを作成できます。これにより、VOリストでの追加の反復を回避できます。

ここに示した方法にとどまる場合は、ID リストの初期化時にリスト サイズを指定して、ArrayList 内の基になる配列の複数の再割り当てを回避することをお勧めします。

List<String> employeeIdList = new ArrayList<String>(employeeIdList.size());

コレクション操作を最適化するには、このコレクションに対して実行される操作を検討して、より適切な実装を選択する必要があります。(主に追加/削除操作 => LinkedList、ランダム アクセス (get(n)) => arrayList、contains => Set など...)

于 2013-06-07T09:49:26.957 に答える
0

他の方法があるかどうかは関係ありませんが、最終的には反復のみで行われます。

さらに、それを達成するのに役立つ直接的な API はないと思います。

したがって、あなたがしていることは、これを行うための最良の方法です。

もう 1 つ、従業員の VO を入力しながら行うことができます。その時点で、従業員 ID のマップまたは別のリストを作成できます。

しかし、繰り返しますが、これは単なる最適化です。

于 2013-06-07T09:47:16.450 に答える