如何使用Java流过滤List <string,object>集合?

时间:2019-02-05 06:33:00

标签: java java-8 java-stream

我有

List<String, Person> generalList

作为列表。 在“人员”下有一个“客户”对象,在“客户”下还有一个名为ID的列表

我想在对象下过滤此嵌套的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*/
}

2 个答案:

答案 0 :(得分:2)

您可能正在寻找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;

答案 1 :(得分:1)

更新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();

已更新,以适应已编辑的问题