我有一个EmpData对象

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


}


和一个区域对象

public class Areas {
    private String areaName;

    public String getAreaName() {
        return areaName;
    }

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


}


我试图遍历整个empDataList,其AreasList包含“ VENG”,
然后获取那个特定的EmpData

这是我的测试客户

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>

最佳答案

您需要filter,而不是flatMap。对于每个EmpData元素,应用一个在区域List上流动的过滤器以找到所需的区域名称:

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


如果要单个EmptData实例,请更改终端操作:

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

10-06 09:02