特定のオブジェクトのリストがあると想像してください:
List<Student>
そして、上記のリストのids
のStudents
を含む別のリストを生成する必要があります。
List<Integer>
ループの使用を避けて、Apache collectionsまたはguava?を使用してこれを達成することは可能ですか?
私の場合、どのメソッドが便利ですか?
Java 8の方法:-
List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
グアバでは、次のような機能を使用できます-
private enum StudentToId implements Function<Student, Integer> {
INSTANCE;
@Override
public Integer apply(Student input) {
return input.getId();
}
}
この関数を使用して、学生のリストを次のようなIDに変換できます。
Lists.transform(studentList, StudentToId.INSTANCE);
確かにすべてのIDを抽出するためにループしますが、guavaメソッドがビューを返し、List<Integer>
を反復しようとしたときにのみFunctionが適用されることを忘れないでください
反復しない場合、ループは適用されません。
注:これはビューであることに注意してください。複数回繰り返したい場合は、他のList<Integer>
のようなコンテンツをコピーする方が良いでしょう
ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));
Premrajのおかげで、代替のクールなオプションが提供されました。
Apache CollectionUtilsとBeanUtilsを使用しました。したがって、次のコードのパフォーマンスに満足しています。
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList,
new BeanToPropertyValueTransformer("id"));
言及する価値があるのは、グアバ(Premraj提供)と上記で使用したcollectionUtilsのパフォーマンスを比較し、より高速なものを決定することです。
Java 8ラムダ式ソリューション:
List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
数年後に誰かがここに来た場合:
List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));