首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用java流过滤List<String,Object>集合?

如何用java流过滤List<String,Object>集合?
EN

Stack Overflow用户
提问于 2019-02-05 14:33:00
回答 2查看 454关注 0票数 0

我有过

代码语言:javascript
复制
List<String, Person> generalList

作为一个列表。Person下有Customer对象,Customer命名Id下还有1个列表

我想在object下过滤这个嵌套的IdList,但它不起作用。

我尝试使用flatMap,但此代码不起作用

代码语言:javascript
复制
String s = generalList.stream()
.flatMap(a -> a.getCustomer().getIdList().stream())
.filter(b -> b.getValue().equals("1"))
.findFirst()
.orElse(null);

我希望输出为字符串或客户对象

编辑:我的原始容器是一个地图,我正在过滤地图到列表

解释一下。

代码语言:javascript
复制
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);

这就是那个人

代码语言:javascript
复制
public class Person
{
private Customer customer;

public Customer getCustomer ()
{
    return customer;
}
}

和客户

代码语言:javascript
复制
public class Customer {
private Id[] idList;
/*getter setter*/
}

和Id

代码语言:javascript
复制
public class Id {
private String value;
/*getter setter*/
}
EN

回答 2

Stack Overflow用户

发布于 2019-02-05 16:14:35

您可能正在寻找一个map操作,如下所示:

代码语言:javascript
复制
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);

这等同于(只是为了澄清)

代码语言:javascript
复制
String valueToMatch = "1";
String s = list.stream()
        .flatMap(a -> a.getCustomer().getIdList().stream())
        .anyMatch(b -> b.getValue().equals(valueToMatch))
        ? valueToMatch : null;
票数 2
EN

Stack Overflow用户

发布于 2019-02-05 15:24:18

更新2此解决方案直接在Person对象列表上工作:

代码语言:javascript
复制
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()列表上获得了流,而且还直接在它们上进行了过滤。因此,如果我正确理解了您的代码结构,这应该是可行的

代码语言:javascript
复制
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();

已更新以针对已编辑的问题进行调整

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54528857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档