java - 使用 Java 8 : Map<String, 基于对象的属性从 Map<String, Set<Object>> 中设置 <Object>> 进行过滤

标签 java java-8 hashmap java-stream

这是类 Item。

public class Item {
    String id;
    String name;
    Integer value;
    Boolean status;
}

我有一个 map (字符串,集合(项目))。我想编写一个返回 Map(String, Set(Item)) 的方法,以便结果映射中仅存在 status = false 或 status = null 的项目。我不想要一个集合范围的操作。我希望生成的子集仅包含那些具有 status == Boolean.FALSE 或 status == null 的 Item。我不希望包含或排除整个集合。我只想根据状态值包含或排除那些单独的项目。

这是我到目前为止所尝试过的。

public Map<String,Set<Item>> filterByStatus(Map<String, Set<Item>> changes) {
    return changes.entrySet()
                  .stream()
                  .filter(p -> p.getValue()
                                .stream()
                                .anyMatch(item -> BooleanUtils.isNotTrue(item.isStatus())))
                  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

没成功!如果我没有调用filterByStatus,我会得到相同的结果。

更新

public Map<String,Set<Item>> filterByStatus(Map<String, Set<Item>> changes) {
    return changes.entrySet()
                  .stream()
                  .map(p -> p.getValue()
                                .stream()
                                .filter(item -> BooleanUtils.isNotTrue(item.isStatus())))
                  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

结果:collect(Collectors.toMap()) 行中出现错误,指出无法从静态上下文引用非静态方法。

最佳答案

public Map<String, Set<Item>> filterByStatus(Map<String, Set<Item>> changes) {
    return changes.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey, entry ->
                entry.getValue()
                    .stream()
                    .filter(item -> item.status == null || item.status == Boolean.FALSE)
                    .collect(Collectors.toSet())
            ));
}

关于java - 使用 Java 8 : Map<String, 基于对象的属性从 Map<String, Set<Object>> 中设置 <Object>> 进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48698567/

相关文章:

Java 使用位移位将 long 的位分成两部分

java - 如何使用 Files.walk()... 根据条件获取文件图?

java - 无法理解为什么要使用参数化日志记录

java - HashMap 重复值 - 识别重复项

java - EmployeeStore 中的编辑方法

java - 在 Java 中模拟命名参数

java - 将 "pass"数据从 Spring FORM 传输到 DAO 的通用方法是什么?

java - 引用 BufferedReader 对象的 Reader 类型的对象无法访问 readLine() 方法

java - 如何在模拟 LocalDateTime 时模拟分钟值?

java - 单作者/单读者场景的 HashMap 或 ConcurrentHashMap?