Java 8 Stream 按键过滤对象列表。排除列表中的键并获取字符串

Posted

技术标签:

【中文标题】Java 8 Stream 按键过滤对象列表。排除列表中的键并获取字符串【英文标题】:Java 8 Stream filter object list by key. Exclude key that are in List & get String 【发布时间】:2021-01-29 15:38:10 【问题描述】:

我想从一个列表中排除对象,其 id 包含在另一个 Id 列表中,并获得一个字段名称字符串。" Care, Safe"

例子:

public interface Selectable 
     Long getId();
     String getName();

我有一个list<Selectable> tenants

id, name
34, "House"
35, "Care"
36, "Villa"
37, "Safe"

还有一个List<Long> idTenantsWithAlerts

id
34
36

我需要结果字符串 tenantsNoAlerts"Care, Safe"

我对 java8 流没有太多经验,所以我尝试了相同的过滤器、映射和归约......但没有运气。

【问题讨论】:

List<Long, String>?该类型不存在。 @Polygnome。不,我会设置代码 @Eklavya 我设置了一些代码... 是否可以将tenants 用作Map<Long, String> 而不是List<Selectable>?如果可能,那么您的流过滤器会更有效、更简单。 您可以将idTenantsWithAlerts List 替换为Set。它最常用的实现HashSet 的查找时间复杂度为 O(1) 【参考方案1】:

您可以通过Idmapcollect 过滤列表,加入收集器减少Stream 为@987654325 @。

List<Selectable> tenants;
String tenantsNoAlerts = tenants.stream()
    .filter(entry -> !idTenantsWithAlerts.contains(entry.getId()))
    .map(entry -> entry.getName())
    .collect(Collectors.joining(", "));

【讨论】:

我认为应该是!idTenantsWithAlerts.contains(entry.getId()),因为那些ids要被排除在外,否则这很可能是OP想要的。 @deHaar 是的!如果您想编辑更改,我会接受答案。谢谢 @deHaar 你是对的,我错过了反转条件。感谢您的提示;)

以上是关于Java 8 Stream 按键过滤对象列表。排除列表中的键并获取字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java Stream 根据第二个列表中的值过滤列表

java-8 过滤列表而不创建新列表

是否可以在 Java 8 中转换流?

我可以以某种方式从java中的Collections.Min / Collections.Max中排除或过滤掉一个值吗?

使用Java 8 Parallel Stream在并行读取多个文件时排除某些文件

Java stream常用实例代码