Reputation: 3457
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
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