我见过许多流式传输java自定义列表的示例,例如: List<People>
,用于过滤单个值,例如
p -> p.Name.contains("john")
。 (People pojo有一些属性:Name
,Age
,Sex
)。
我想实际流式传输而不过滤单个值但过滤字符串列表,即仅仅是“John”,我可以提供要过滤的项目列表。
e.g。伪:p -> p.Name.contains(List<String>)
我希望这很容易解释而不需要代码。
有什么想法吗?
答案 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()))
,我建议您将包含List
到Set
实施名称的集合更改为{{使用contains
而不是Set
实施方法,1}}方法的效果会更好。
当然,这是当且仅在适当的情况下这样做而不会导致其他地方的性能不足。