[java] 다른 목록에있는 개체의 속성으로 새 목록을 만드는 방법

특정 개체 목록이 있다고 상상해보십시오.

List<Student>

그리고 위 목록 의 idsof Students를 포함하여 다른 목록을 생성해야 합니다.

List<Integer>

루프를 사용하지 않고 아파치 컬렉션 이나 구아바를 사용하여이를 달성 할 수 있습니까?

제 경우에 어떤 방법이 유용해야합니까?



답변

그것을하는 자바 8 방법 :-

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


답변

Guava를 사용하면 다음과 같은 기능을 사용할 수 있습니다.

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 메서드는 view를 반환하고 Function은 반복 List<Integer>
하지 않으면 반복 을 시도 할 때만 적용됩니다 .

참고 : 이것이보기라는 것을 기억하고 여러 번 반복하려는 경우 다른 List<Integer>유사한 콘텐츠를 복사하는 것이 좋습니다.

ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));


답변

Premraj 덕분에대체 멋진 옵션에 대한 에게 .

나는 아파치 CollectionUtils와 BeanUtils를 사용했습니다. 따라서 다음 코드의 성능에 만족합니다.

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

위에서 사용한 guava ( Premraj 제공)와 collectionUtils 의 성능을 비교 하고 더 빠른 것을 결정할 것입니다.


답변

자바 8 람다 표현 솔루션 :

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


답변

몇 년 후에 누군가 여기에 오면 :

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


답변

루프없이이를 수행하는 것은 수학적으로 불가능합니다. 불연속 값 집합의 매핑 F를 다른 불연속 값 집합에 매핑하려면 F가 원래 집합의 각 요소에 대해 작동해야합니다. (기본적으로이를 수행하려면 루프가 필요합니다.)

즉,

새 목록이 필요한 이유는 무엇입니까? 잘못된 방식으로 해결중인 문제에 접근 할 수 있습니다.

목록이있는 Student경우이 목록을 반복 할 때 학생의 ID 번호를 반복 할 때 한두 단계 만 남았습니다.

for(Student s : list)
{
    int current_id = s.getID();
    // Do something with current_id
}

다른 종류의 문제가있는 경우 질문에 댓글을 달거나 업데이트하면 도와 드리겠습니다.


답변