我有过
List<String, Person> generalList作为一个列表。Person下有Customer对象,Customer命名Id下还有1个列表
我想在object下过滤这个嵌套的IdList,但它不起作用。
我尝试使用flatMap,但此代码不起作用
String s = generalList.stream()
.flatMap(a -> a.getCustomer().getIdList().stream())
.filter(b -> b.getValue().equals("1"))
.findFirst()
.orElse(null);我希望输出为字符串或客户对象
编辑:我的原始容器是一个地图,我正在过滤地图到列表
解释一下。
Map<String, List<Person> container;
List<Person> list = container.get("A");
String s = list.stream()
.flatMap(a -> a.getCustomer().getIdList().stream())
.filter(b -> b.getValue().equals("1"))
.findFirst()
.orElse(null);这就是那个人
public class Person
{
private Customer customer;
public Customer getCustomer ()
{
return customer;
}
}和客户
public class Customer {
private Id[] idList;
/*getter setter*/
}和Id
public class Id {
private String value;
/*getter setter*/
}发布于 2019-02-05 16:14:35
您可能正在寻找一个map操作,如下所示:
String s = list.stream()
.flatMap(a -> a.getCustomer().getIdList().stream())
.filter(b -> b.getValue().equals("1"))
.findFirst()
.map(Id::getValue) // map to the value of filtered Id
.orElse(null);这等同于(只是为了澄清)
String valueToMatch = "1";
String s = list.stream()
.flatMap(a -> a.getCustomer().getIdList().stream())
.anyMatch(b -> b.getValue().equals(valueToMatch))
? valueToMatch : null;发布于 2019-02-05 15:24:18
更新2此解决方案直接在Person对象列表上工作:
String key = "1";
List<Person> list = container.get("A");
String filteredValue = list.stream()
.flatMap(person -> Arrays.stream(person.getCustomer().getId())
.filter(id -> id.getValue().equals(key)))
.findFirst().get().getValue();旧的答案是使用地图,因为你只对地图的值感兴趣,你应该在它们上流式传输,在flatMap中,我不仅在getId()列表上获得了流,而且还直接在它们上进行了过滤。因此,如果我正确理解了您的代码结构,这应该是可行的
String key = "1";
String filteredValue = map.values().stream()
.flatMap(list -> list.stream()
.flatMap(person -> Arrays.stream(person.getCustomer().getId())
.filter(id -> id.getValue().equals("1"))))
.findFirst().get().getValue();已更新以针对已编辑的问题进行调整
https://stackoverflow.com/questions/54528857
复制相似问题