어떻게 새 목록에 자바에서 8 필터이 개 목록 개체 및 설정 값을 스트림을 사용하는

trungitdn92 :

나는 자바 8을 사용하고 내가 좋아하는 두 물체의 모양을 가지고 :

Person 클래스 :

public class Person {

    private String id;
    private String name;

    public Person() {
    }

    public Person(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

PERSON1 클래스 :

public class Person1 {
    private String id;
    private String name;

    public Person1() {
    }

    public Person1(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person1{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

내가 좋아하는이 개 목록의 모양을 가지고 :

 List<Person> persons= Arrays.asList(new Person("1","A"),new Person("2","B"));
  List<Person1> persons1 = Arrays.asList(new Person1("3","C"),new Person1("1","F"));

지금은 스트림 자바 8 루프이 목록을 사용하여 비교합니다. 목록 사람의 모든 개체가 persons1와 동일하면, 나는 새 목록을 만들고 새로운 값으로 설정합니다. 예 : 만약 PERSON1 ( "1", "F")는 사람과 동일 ( "1", "A") 내가 사용하기 때문에 ID를 내가 사람을 PERSON1 세트에서 이름을 얻을 비교합니다. 사람 ( "1,"F ")을하고 그것을 두 가지 새로운 목록을 추가 : 결과.

난에 사용 내 코드 :

 for (Person person : persons) {
            for (Person1 person1 : persons1 ) {
                if (person1.getId().equals(person.getId())) {
                    person.setName(person1.getId());
                    break;
                }
            }
        }

지금은 같은 새로운 목록 표정으로 스트림으로 변환합니다 :

 List<Person> personList =
                list.stream()
                        .filter (
                                person -> list1.stream()
                                        .anyMatch(person1 -> person1.getId()== person.getId()))
                        .collect(Collectors.toList());

그러나 그것은 단지 사람을 필터링합니다. 나는이 목록 개체를 비교합니다. 동일한 ID, 내가 사람에게 persons1에서 개체에서 설정 이름을합니다. 나는 우리가 스트림 자바 8 맵을 사용 할 수 있습니다 알고하지만 난 그렇게 할 수없는 방법에 대해 설명합니다. 도와주세요

라빈 드라 Ranwala :

일부 작업은 최선의 반복과 스트림, 다른 사람과 수행됩니다. 대부분의 작업은 가장 두 가지 방법을 결합하여 수행됩니다. 이 솔루션에서 스트림지도를 구성하는 데 사용 된 후 반복이 일치하는 사람의 이름을 업데이트하는 데 사용됩니다. 귀하의 솔루션은 선형 시간 복잡도에서이 솔루션을 실행하는 반면 이차 시간에 실행됩니다.

Map<String, String> idToNameMap = persons1.stream()
    .collect(Collectors.toMap(Person1::getId, Person1::getName, (a, b) -> a));
for (Person person : persons) {
    if (idToNameMap.containsKey(person.getId())) {
        person.setName(idToNameMap.get(person.getId()));
    }
}

추천

출처http://43.154.161.224:23101/article/api/json?id=226795&siteId=1