基于List的Java Stream自定义列表

时间:2018-02-12 21:59:07

标签: java list java-stream pojo

我见过许多流式传输java自定义列表的示例,例如: List<People>,用于过滤单个值,例如

p -> p.Name.contains("john")。 (People pojo有一些属性:NameAgeSex)。

我想实际流式传输而不过滤单个值但过滤字符串列表,即仅仅是“John”,我可以提供要过滤的项目列表。

e.g。伪:p -> p.Name.contains(List<String>)

我希望这很容易解释而不需要代码。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用List::contains来过滤使用字符串列表:

List<People> people = Arrays.asList(
        new People("John", 25, "M"),
        new People("Jane", 25, "F"),
        new People("Pete", 25, "M"),
        new People("Albert", 25, "M"),
        new People("Victor", 25, "M")
);

List<String> names = Arrays.asList("John", "Pete", "Victor");

List<People> filtered = people.stream()
        .filter(p -> names.contains(p.getName())) // if the name of p is contained in the list of string names to filter
        .collect(Collectors.toList());

输出:

People{name='John', age=25, sex='M'}, 
People{name='Pete', age=25, sex='M'}, 
People{name='Victor', age=25, sex='M'}

答案 1 :(得分:2)

最简单和最简单的选择是按照其他人的建议使用列表的contains方法。

虽然你也可以这样做:

.filter(p -> namesList.stream().anyMatch(name -> name.equals(p.getName())))
...

或稍微更多地包含其他答案,您可以将上述内容更改为:

.filter(p -> namesList.stream().anyMatch(name -> Objects.equals(name, p.getName())))
...

因此,当NPE包含namesList元素时,请避免null

除此之外,如果您要继续.filter(p -> namesList.contains(p.getName())),我建议您将包含ListSet实施名称的集合更改为{{使用contains而不是Set实施方法,1}}方法的效果会更好。

当然,这是当且仅在适当的情况下这样做而不会导致其他地方的性能不足。