Извлечь часть списка на основе динамического ввода - PullRequest
0 голосов
/ 23 мая 2019

В моем весеннем загрузочном приложении есть список моделей-кандидатов типа - Список.Он имеет несколько атрибутов (id, firstName, lastName, обозначение и т. Д.).

Я хотел бы получить другой список (List) из первого списка, содержащий только несколько атрибутов (id, lastName), иоставшиеся значения установлены в ноль.Обязательные атрибуты (столбцы таблицы - id, lastName) получаются только во время выполнения.Как этого достичь?

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Вы можете достичь этого очень легко, используя Java 8 .. См. Ниже:

public class Candidate {

    public Candidate() {
        super();
    }

    public Candidate(int id, String firstName) {
        super();
        this.id=id;
        this.firstName=firstName;
    }

    private int id;
    private String firstName;
    private String lastName;
    private String designation; 


//getters &setters

    @Override
    public String toString() {
        return this.id +"....FirstName:"+this.firstName+"......LastName:"+this.lastName+"....Designation:"+this.designation;
    }   
}

Test.java

открытый класс Test {

public static void main(String[] args) {
    List<Candidate> canditates= new ArrayList<>();
    for(int i=1;i<=5;i++){
        Candidate candidate = new Candidate();
        candidate .setId(i);
        candidate .setDesignation("Desig:"+i);
        candidate .setFirstName("FrstName:"+i);
        candidate .setLastName("LastName:"+i);

        canditates.add(candidate );
    }
    System.out.println(canditates);


    List<Candidate> newList=canditates.stream()
            .map(c -> new Candidate(c.getId(), c.getFirstName()))
            .collect(Collectors.toList());
    System.out.println(newList);

}

}

0 голосов
/ 23 мая 2019

Вам нужно будет создать новый Candidates с полями, равными нулю.

Предположим, что ваш класс-кандидат выглядит примерно так ...

public class Candidate {
    private long id;
    private String firstName;
    // etc

    public Candidate(long id, String firstName, String lastName, String designation /* etc */) {
        ...assign fields...
    }

    // Getters...
}

Вы можете сделать что-то вроде этого ...

List<Candidate> candidates = getThemSomehow();

List<Candidate> partialCandidates = candidates.stream()
    .map(c -> new Candidate(c.getId(), null, c.getLastName(), null, null))
    .collect(Collectors.toList());

EDIT:

Почему бы не использовать бин-интроспектор?

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) {
        List<Candidate> candidates = Arrays.asList(
                new Candidate(1L, "Fred", "West", "Lunatic"),
                new Candidate(2L, "John", "Lennon", "Beatles"),
                new Candidate(3L, "Dave", "Smith", "SomeBlokeIMetDownThePub")
        );

        Set<String> fields = new HashSet<>(Arrays.asList("id", "firstName", "designation"));

        List<Candidate> partialCandidates = candidates.stream().map(c -> createPartialCopy(c, fields)).collect(Collectors.toList());

        partialCandidates.forEach(System.out::println);
    }

    public static <T> T createPartialCopy(T source, Set<String> properties) {
        BeanInfo beanInfo;

        try {
            beanInfo = Introspector.getBeanInfo(source.getClass());
        } catch (IntrospectionException e) {
            throw new IllegalStateException("Could not introspect " + source, e);
        }

        T copy;

        try {
            copy = (T) source.getClass().newInstance();
        } catch (InstantiationException e) {
            throw new IllegalStateException("Could not instantiate " + source.getClass(), e);
        } catch (IllegalAccessException e) {
            throw new IllegalStateException("Could not create " + source.getClass() + " no public zero arg constructor.", e);
        }

        properties.stream()
                .flatMap(p -> Arrays.stream(beanInfo.getPropertyDescriptors()).filter(d -> d.getName().equals(p)))
                .forEach(d -> doCopy(d, source, copy));

        return copy;
    }

    private static <T> void doCopy(PropertyDescriptor propertyDescriptor, T source, T copy) {
        try {
            propertyDescriptor.getWriteMethod().invoke(copy, propertyDescriptor.getReadMethod().invoke(source));
        } catch (InvocationTargetException | IllegalAccessException e) {
            throw new IllegalStateException("Could copy property " + propertyDescriptor.getName(), e);
        }
    }

    public static class Candidate {
        private long id;
        private String firstName;
        private String lastName;
        private String designation;

        public Candidate() {

        }

        public Candidate(long id, String firstName, String lastName, String designation) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
            this.designation = designation;
        }

        public long getId() {
            return id;
        }

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

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

        public String getDesignation() {
            return designation;
        }

        public void setDesignation(String designation) {
            this.designation = designation;
        }

        @Override
        public String toString() {
            return "Candidate{" +
                    "id=" + id +
                    ", firstName='" + firstName + '\'' +
                    ", lastName='" + lastName + '\'' +
                    ", designation='" + designation + '\'' +
                    '}';
        }
    }
}
  • Объекты, которые вы копируете, должны быть класса с конструктором 0-arg.
  • У вас должны быть геттеры и сеттеры для всех свойств, которые вы хотите скопировать.

Печать ...

Candidate{id=1, firstName='Fred', lastName='null', designation='Lunatic'}
Candidate{id=2, firstName='John', lastName='null', designation='Beatles'}
Candidate{id=3, firstName='Dave', lastName='null', designation='SomeBlokeIMetDownThePub'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...