swaroop pallapothu
swaroop pallapothu

Reputation: 608

How to convert list of java bean to another list of beans using streams

I have bean like follows

public class CleanPermission {

    private int id;

    private int objectId;

    private boolean visible;
    private boolean order;

    public int getId() {
        return id;
    }

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

    public int getObjectId() {
        return objectId;
    }

    public void setObjectId(int objectId) {
        this.objectId = objectId;
    }

    public boolean isVisible() {
        return visible;
    }

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    public boolean isOrder() {
        return order;
    }

    public void setOrder(boolean order) {
        this.order = order;
    }

}

public class Permission {

    private int id;

    private AppPermission appPermission;

    private int objectId;

    private boolean enabled;

    public int getId() {
        return id;
    }

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

    public AppPermission getAppPermission() {
        return appPermission;
    }

    public void setAppPermission(AppPermission appPermission) {
        this.appPermission = appPermission;
    }

    public int getObjectId() {
        return objectId;
    }

    public void setObjectId(int objectId) {
        this.objectId = objectId;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

}

In the CleanPermission.java visible, order are the permissions which refers to AppPermission in the Permission.java

I will get List of CleanPermission from server (List). I want to convert this list of CleanPermissions to List based on permission type(visible create seperate Permission object).

Currently i am converting like below. But i want to convert this using java streams. So, i need help to convert using java streams.

public List<Permission> get(List<CleanPermission> cleanPermissions) {
    List<Permission> permissions = new ArrayList();
    Permission permission;
    for (CleanPermission cleanPermission : cleanPermissions) {
        permission = new Permission();
        permission.setAppObjectType(cleanPermission.getAppObjectType());
        permission.setEnabled(cleanPermission.isVisible());
        permission.setAppPermission(new Permission(){{
            setId(1);
        }});
        permissions.add(permission);
        permission = new Permission();
        permission.setObjectId(cleanPermission.getObjectId());
        permission.setEnabled(cleanPermission.isOrder());
        permission.setAppPermission(new Permission(){{
            setId(2);
        }});
        permissions.add(permission);
    }
    if (!permissions.isEmpty()) {
        System.out.println(permissions.size());
    }
    return permissions;

}

Sample Data:

List<CleanPermission> cleanPermissions = new ArrayList() {
    {
        add(new CleanPermission() {
            {
                setVisible(true);
                setOrder(false);
                setObjectId(1);
            }
        });
        add(new CleanPermission() {
            {
                setVisible(false);
                setOrder(false);
                setObjectId(2);
            }
        });
        add(new CleanPermission() {
            {
                setVisible(true);
                setOrder(true);
                setObjectId(3);
            }
        });                
    }
};

Upvotes: 0

Views: 2554

Answers (2)

Sergey Prokofiev
Sergey Prokofiev

Reputation: 1885

There are dozen of ways how to refactor that with streaming API. First of all I suggest to encapsulate conversion method.

public List<Permission> convert(CleanPermission cp) {
    List<Permission> permissions= new ArrayList<>()
    permission = new Permission();
    permission.setAppObjectType(cleanPermission.getAppObjectType());
    permission.setEnabled(cleanPermission.isVisible());
    permission.setAppPermission(new Permission(){{
        setId(1);
    }});
    permissions.add(permission);
    permission = new Permission();
    permission.setObjectId(cleanPermission.getObjectId());
    permission.setEnabled(cleanPermission.isOrder());
    permission.setAppPermission(new Permission(){{
        setId(2);
    }});
    permissions.add(permission);
    return permissions;
}

And the processing

cleanPermissions.stream().map(this::convert)
     .flatMap(Collection::stream).collect(Collectors.toList());

or

cleanPermissions.stream().map(this::convert)
     .collect(ArrayList::new, ArrayList::addAll, ArrayList::addAll);

Upvotes: 1

user4910279
user4910279

Reputation:

Try this.

@SafeVarargs
static <T> T build(T t, Consumer<T>... setters) {
    for (Consumer<T> b : setters)
        b.accept(t);
    return t;
}

public List<Permission> get(List<CleanPermission> cleanPermissions) {
    return cleanPermissions.stream()
        .flatMap(c ->  Stream.of(
            build(new Permission(),
                p -> p.setAppObjectType(c.getAppObjectType()),
                p -> p.setEnabled(c.isVisible()),
                p -> p.setAppPermission(
                    build(new Permission(), a -> a.setId(1)))),
            build(new Permission(),
                p -> p.setObjectId(c.getObjectId()),
                p -> p.setEnabled(c.isOrder()),
                p -> p.setAppPermission(
                    build(new Permission(), a ->a.setId(2))))))
        .collect(Collectors.toList());
}

Upvotes: 0

Related Questions