user974802
user974802

Reputation: 3457

How to Stream and get the required format type Of Object

I have a EmpData Object

import java.util.ArrayList;
import java.util.List;

public class EmpData {


    private List<Areas> areasList = new ArrayList<Areas>();


    public List<Areas> getAreasList() {
        return areasList;
    }
    public void setAreasList(List<Areas> areasList) {
        this.areasList = areasList;
    }


}

and a Area Object

public class Areas {
    private String areaName;

    public String getAreaName() {
        return areaName;
    }

    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }


}

I am trying to loop through the whole empDataList whose AreasList contains "VENG" , then get that particular EmpData

This is my Test Client

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ClientTest {

    public static void main(String[] args) {

        List<EmpData> empDataList = new ArrayList<>();
        List<Areas> areasList = new ArrayList<Areas>();


        Areas area1 = new Areas();
        area1.setAreaName("VENG");

        areasList.add(area1);

        EmpData empData1 = new EmpData();

        empData1.setAreasList(areasList);

        empDataList.add(empData1);


        List<EmpData> allData =  empDataList.stream()
            .flatMap(e -> e.getAreasList().stream()
                .filter(a -> a.getAreaName().equals("VENG")))
            .collect(Collectors.toList());

    }

}

Type mismatch: cannot convert from List<Areas> to List<EmpData> 

Upvotes: 2

Views: 83

Answers (1)

Eran
Eran

Reputation: 394116

You need filter, not flatMap. For each EmpData element, apply a filter that streams over the areas List to locate the required area name:

List<EmpData> allData =  
    empDataList.stream()
               .filter(e->e.getAreasList().stream().anyMatch(a->a.getAreaName().equals("VENG")))
               .collect(Collectors.toList());

If you want a single EmptData instance, change the terminal operation:

Optional<EmpData> emp =  
    empDataList.stream()
               .filter(e->e.getAreasList().stream().anyMatch(a->a.getAreaName().equals("VENG")))
               .findFirst();

Upvotes: 6

Related Questions