2

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?

5
  • 1
    Your loop solution can be significantly improved by using a for-each loop Commented Oct 5, 2020 at 15:37
  • 2
    And using Builder or Constructor make it better. Commented Oct 5, 2020 at 15:38
  • 1
    With "using lambda expression", I assume you mean using Stream? Commented Oct 5, 2020 at 15:38
  • Does this answer your question? How to clone ArrayList and also clone its contents? Commented Oct 5, 2020 at 15:44
  • 1
    In your case it's not a straight-forward copy, as you are mapping to a different element type, but the basics are the same. I'd write either a constructor for MyObject that accepts a OtherObject. Commented Oct 5, 2020 at 15:48

3 Answers 3

3

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());
}
Sign up to request clarification or add additional context in comments.

2 Comments

The method reference approach is much more readable; I'd encourage its use by showing it first.
Thank you, very much. This is the perfect solution for my situation.
1

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;
    }

3 Comments

.stream() is redundant if you're going to use the terminating operator forEach() anyways. objects.forEach( would suffice.
Edited to objects.forEach()
But still, mutating external state in a stream is considered an anti-pattern; that is better done via reduction, or in this case, the special form of reduction called collection. Here is some more information: developer.ibm.com/articles/j-java-streams-2-brian-goetz
0

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);
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.