web-dev-qa-db-ja.com

別のリストにあるオブジェクトのプロパティを使用して新しいリストを作成する方法

特定のオブジェクトのリストがあると想像してください:

List<Student>

そして、上記のリストのidsStudentsを含む別のリストを生成する必要があります。

List<Integer>

ループの使用を避けて、Apache collectionsまたはguava?を使用してこれを達成することは可能ですか?

私の場合、どのメソッドが便利ですか?

71
Javatar

Java 8の方法:-

List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
150
Kaushik

グアバでは、次のような機能を使用できます-

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));
39
Premraj

Premrajのおかげで、代替のクールなオプションが提供されました。

Apache CollectionUtilsとBeanUtilsを使用しました。したがって、次のコードのパフォーマンスに満足しています。

List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, 
                                    new BeanToPropertyValueTransformer("id"));

言及する価値があるのは、グアバ(Premraj提供)と上記で使用したcollectionUtilsのパフォーマンスを比較し、より高速なものを決定することです。

22
Javatar

Java 8ラムダ式ソリューション:

List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
6
Vijay Gupta

数年後に誰かがここに来た場合:

List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
5