Search code examples
javacollectionsjava-8java-stream

Java 8 iterate nested loop and fetch details


I have a model object which contains nested arrays and i want to retrieve some details within that model .How to collect property msg from subscriberCriteriaList into an array where subscriberCriteriaList.status is FAIL. I would expect java 8 solution for the same ? Below is the sample model objects and the corresponding json structure .

public class Data{
private List<subscriberList> subscriberCriteriaList;

}

public class subscriberList{

private String mdn;
private List<SubscriberCriteriaList> subscriberCriteriaList;

}

public class SubscriberCriteriaList{

private String status;
private String msg;

}

Sample json structure

   {
"subscriberList": [
  {       
    "mdn": "string",
    "subscriberCriteriaList": [
      {
        "status": "FAIL",
        "msg": "error message"
      }
    ]
  }
]
}

Solution

  • Assuming that the top-level object has type Data, and appropriate getters are available in all the mentioned classes, it is possible to apply flatMap to the nested lists and filter by status value:

    String[] failureMessages = data.getSubscriberCriteriaList()
        .stream() // Stream<subscriberList>
        .flatMap(sl -> sl.getSubscriberCriteriaList().stream()) // Stream<SubscriberCriteriaList>
        .filter(scl -> "FAIL".equals(scl.getStatus()))
        .map(SubscriberCriteriaList::getMsg) // map to messages
        .distinct() // (optionally) remove duplicates if necessary
        .toArray(String[]::new);