How to replace nested loops with Java 8 threads

I want to use Java 8 thread for implementation below. Basically I want to parse one list and make another list of different objects.

Input - a list of pojos characters; Output - a list of PersonInfo pojos

    List<Person> persons = new ArrayList<Person>();

    Person max = new Person();
    max.setName("Max");
    max.setAge(10);
    max.addAddress(new Address("Street1", "City1"));
    max.addAddress(new Address("Street2", "City2"));

    Person peter = new Person();
    peter.setName("Peter");
    peter.setAge(20);
    peter.addAddress(new Address("Street1", "City1"));
    peter.addAddress(new Address("Street2", "City2"));

    persons.add(max);
    persons.add(peter);

    System.out.println("Input: " + persons);

    List<PersonInfo> personInfos = new ArrayList<PersonInfo>();
    PersonInfo personInfo = null;
    for (Person person : persons) {
        for (Address addr : person.getCurrAndPrevAddrs()) {
            personInfo = new PersonInfo();
            personInfo.setName(person.getName());
            personInfo.setAge(person.getAge());
            personInfo.setAddrs(addr);              
            personInfos.add(personInfo);
        }
    }

    System.out.println("Output: " + personInfos.toString());

sample output : Input : [Max. 10 [Street1 City1, Street2 City2]

Peter 20 [Street1 City1, Street2 City2]]

Output : [Max. 10 Street1 City1

Max. 10 Street2 City2

Peter 20 Street1 City1

Peter 20 Street2 City2]

+4
source share
3 answers
List<PersonInfo> personInfos = persons.stream().flatMap(person -> person.getCurrAndPrevAddrs().stream().map(addr -> {
        PersonInfo personInfo = new PersonInfo();
        personInfo.setName(person.getName());
        personInfo.setAge(person.getAge());
        personInfo.setAddrs(addr);              
        return personInfo;
})).collect(Collectors.toList());
+4
source

, . Pojos .

List<Person> persons = new ArrayList<Person>();

Person person1 = new Person("person1");
Person person2 = new Person("person2");

persons.add(person1);
persons.add(person2);

List<PersonInfo> personInfos = new ArrayList<PersonInfo>();
persons.stream().forEach(person -> {    
  person.getCurrAndPrevAddrs().stream().forEach(address -> {
    PersonInfo personInfo = new PersonInfo("personInfo");
    personInfo.setAddress(address);
    personInfos.add(personInfo);
  });
});

System.out.println("Output: " + personInfos.toString());
+2

One way: (1) to improve readability and (2) to simplify the maintenance of your code - add a method toPersonInfoto your class Person, for example:

public class Person {
    //getters, setters, etc.
    public List<PersonInfo> toPersonInfos() {
        List<PersonInfo> result = new ArrayList<>();
        for (Address addr : getCurrentAndPrevAddrs()) {
            PersonInfo pi = new PersonInfo();
            pi.setName(this::getName);
            pi.setAge(this::getAge);
            pi.setAddrs(this::addr);
            result.add(pi);
        }
        return result;
    }
}

That way, if you ever change your PersonInfoor your Personclass, you only need to change one method, and it is right in your class Person.

It also greatly simplifies the flow operation:

personInfos = persons.stream().flatMap(p -> p.toPersonInfos.stream()).collect(Collectors.toList());

Note that this does not necessarily return an ordered list.

+1
source

Source: https://habr.com/ru/post/1670963/


All Articles