Java 基于List的流式自定义列表

Java Stream custom list based on List

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

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

我想实际流式传输而不过滤单个值,但过滤字符串列表,i.e.Instead 仅 "John",我可以提供要过滤的项目列表。

例如伪:p -> p.Name.contains(List<String>)

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

有什么想法吗?

您可以使用 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'}

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

虽然你也可以这样做:

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

或者为了更符合其他答案,您可以将上面的内容更改为:

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

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


除此之外,如果您要继续 .filter(p -> namesList.contains(p.getName())),那么我建议您将包含名称的集合从 List 更改为 Set 实现,因为contains 方法在 Set 中的表现比在 List 中的表现要好得多。

这当然是当且仅当这样做是合适的且不会在其他地方造成性能缺陷时。