web-dev-qa-db-fra.com

Comment convertir une liste de propriétés en une autre liste à la manière de Java 8?

Il y a une liste A avec la propriété Developer. Le schéma de développeur aime ça:

@Getter
@Setter
public class Developer {
    private String name;
    private int age;

    public Developer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Developer name(String name) {
        this.name = name;
        return this;
    }

    public Developer name(int age) {
        this.age = age;
        return this;
    }
}

Liste A avec propriétés:

List<Developer> A = ImmutableList.of(new Developer("Ivan", 25), new Developer("Curry", 28));

Il est demandé de convertir la liste A en liste B qui, avec la propriété ProductManager et les propriétés, est identique à celle de la liste A.

@Getter
@Setter
public class ProductManager {
    private String name;
    private int age;

    public ProductManager(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public ProductManager name(String name) {
        this.name = name;
        return this;
    }

    public ProductManager name(int age) {
        this.age = age;
        return this;
    }
}

Autrefois, nous écrivions des codes tels que:

public List<ProductManager> convert() {
    List<ProductManager> pros = new ArrayList<>();
    for (Developer dev: A) {
        ProductManager manager = new ProductManager();
        manager.setName(dev.getName());
        manager.setAge(dev.getAge());
        pros.add(manager);
    }
    return pros;
}

Comment pourrions-nous écrire ce qui précède de manière plus élégante et plus brève avec Java 8?

6
Ivan

vous devrez utiliser quelque chose comme ci-dessous:

List<ProductManager> B = A.stream()
        .map(developer -> new ProductManager(developer.getName(), developer.getAge()))
        .collect(Collectors.toList());

// pour un grand nombre de propriétés, en supposant que les attributs ont des noms similairesautre sage avec des noms différents se réfèrent this

List<ProductManager> B = A.stream().map(developer -> {
            ProductManager productManager = new ProductManager();
            try {
                PropertyUtils.copyProperties(productManager, developer);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            return productManager;
        }).collect(Collectors.toList());

        B.forEach(System.out::println);
21
Ramachandran.A.G

Probablement comme ça:

List<ProductManager> B = A.stream()
        .map(developer -> new ProductManager(developer.name, developer.age))
        .collect(Collectors.toList());
2
Slava

S'il y a plus de propriétés, peut-être plus de 20, et le constructeur ne peut pas utiliser directement, comment convertir?

Si vous avez plus de 3-4 propriétés à définir, vous devez utiliser un générateur, comme ceci:

List<Developer> A = ImmutableList.of(new Developer("Ivan", 25),
                                     new Developer("Curry", 28));

Function<Developer, ProductManager> converter = dev -> new ProductManagerBuilder()
        .setAge(dev.getAge())
        .setName(dev.getName())
        .setProperty1(dev.getProperty1())
        .setProperty2(dev.getProperty2())
        ...
        .build();

List<ProductManager> productManagers = A.stream()
                                        .map(converter)
                                        .collect(toList());
1
Mahesh

Si vous voulez bien ajouter belwo constructeur dans ProductManger

public ProductManager(Developer d) {
    this.name = d.getName();
    this.age = d.getAge();
}

puis convertir en utilisant la référence du constructeur

    List<Developer> developers = Arrays.asList(new Developer("abc", 25));
    List<ProductManager> managers = developers.stream().map(ProductManager::new).collect(Collectors.toList());
    System.out.println(managers);

sinon, vous pouvez fournir un mappeur personnalisé 

Function<Developer, ProductManager> mapper = d -> new ProductManager(d.getName(), d.getAge()); 

utiliser ceci dans la fonction map

Sortie

[ProductManager [name=abc, age=25]]
0
Saravana