IT TIP

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

itqueen 2020. 10. 22. 23:47
반응형

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


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

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
}

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

참고 URL : https://stackoverflow.com/questions/10975913/how-to-make-a-new-list-with-a-property-of-an-object-which-is-in-another-list

반응형