Java 基于List的流式自定义列表
Java Stream custom list based on List
我见过很多流式传输 java 自定义列表的示例,例如List<People>
,过滤单个值,例如
p -> p.Name.contains("john")
。 (People pojo 有几个属性:Name
、Age
、Sex
)。
我想实际流式传输而不过滤单个值,但过滤字符串列表,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
中的表现要好得多。
这当然是当且仅当这样做是合适的且不会在其他地方造成性能缺陷时。
我见过很多流式传输 java 自定义列表的示例,例如List<People>
,过滤单个值,例如
p -> p.Name.contains("john")
。 (People pojo 有几个属性:Name
、Age
、Sex
)。
我想实际流式传输而不过滤单个值,但过滤字符串列表,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
中的表现要好得多。
这当然是当且仅当这样做是合适的且不会在其他地方造成性能缺陷时。