How to add a set of values from an ArrayList to another ArrayList using Lambda expression

Viewed 651

I have to create a result list by adding objects from one array list to another. Here is my code that works.

    private List<MyObject> getObjectList(List<OtherObject> objects) {
        List<MyObject> resultList = new ArrayList<>();
        for (int i = 0; i < objects.size(); i++) {
        MyObject object = new MyObject()
            object.setId(objects.get(i).getId());
            object.setText(objects.get(i).getTextValue());
            object.setUserId(objects.get(i).getUserName());
            object.setCreatedDate(objects.get(i).getCreateDateTime());

            resultList.add(object);
        }
        
        return resultList;
    }

How can I achieve this by using lambda expression?

3 Answers

Here's how you can do it with a method reference:

private List<MyObject> getObjectList(List<OtherObject> objects) {
    return objects.stream()
        .map(this::map)
        .collect(Collectors.toList());
}

private MyObject map(OtherObject otherObject) {
    MyObject object = new MyObject();
    object.setId(otherObject.getId());
    object.setText(otherObject.getTextValue());
    object.setUserId(otherObject.getUserName());
    object.setCreatedDate(otherObject.getCreateDateTime());
    return object;
}

Here's how you can do it using streams and lambda expression:

private List<MyObject> getObjectList(List<OtherObject> objects) {
    return objects.stream()
        .map(obj -> {
        MyObject object = new MyObject();
        object.setId(obj.getId());
        object.setText(obj.getTextValue());
        object.setUserId(obj.getUserName());
        object.setCreatedDate(obj.getCreateDateTime());
        return object;
    }).collect(Collectors.toList());
}

Here is an example:

    private List<MyObject> getObjectList(List<OtherObject> objects) {
        List<MyObject> resultList = new ArrayList<>();
        objects.forEach(obj -> {
            MyObject object = new MyObject();
            object.setId(obj.getId());
            object.setText(obj.getTextValue());
            object.setUserId(obj.getUserName());
            object.setCreatedDate(obj.getCreateDateTime());
            resultList.add(object);
        });
        return resultList;
    }

Using Record

Equivalent of your OtherObject

import java.time.LocalDateTime;

public record OtherRec(int            id,
                       String         textValue,
                       String         userName,
                       LocalDateTime  createDateTime) {
}

Equivalent of your MyObject

import java.time.LocalDateTime;

public record MyRecord(int id,
                       String text,
                       String userId,
                       LocalDateTime createDate) {
}

Copying list of OtherRec to MyRecord

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

public class CopyList {

    public static void main(String[] args) {
        List<OtherRec> source = List.of(new OtherRec(1, "First", "One", LocalDateTime.of(2020, 10, 5, 12, 0)),
                                        new OtherRec(2, "Second", "Two", LocalDateTime.of(2020, 10, 5, 13, 0)));
        List<MyRecord> target = source.stream()
                                      .map(or -> new MyRecord(or.id(), or.textValue(), or.userName(), or.createDateTime()))
                                      .collect(Collectors.toList());
        System.out.println(target);
    }
}
Related