当前位置: 首页 > 知识库问答 >
问题:

根据条件筛选和收集映射以映射

马胜泫
2023-03-14

class Person {
    String name;
    int age;
}
Map<Sring, List<Person>> myVariable;
Map<String, List<Person>> result;
Predicate<Person> predicate = p -> p.age > 20;
"1": [{name: "Foo", age: 15}, {name: "Foo", age: 13}, {name: "Foo", age: 14}]
"2": [{name: "Foo", age: 15}, {name: "Foo", age: 13}, {name: "Foo", age: 14}]
"3": [{name: "Foo", age: 15}, {name: "Foo", age: 13}, {name: "Foo", age: 14}]
"4": [{name: "Foo", age: 15}, {name: "Foo", age: 21}, {name: "Foo", age: 27}]
"4": {name: "Foo", age: 21}, {name: "Foo", age: 27}]
Map<String, List<Persin>> result = myVariable.keySet().stream()
            .filter(p -> myVariable.keySet(p).stream().anyMatch(predicate))
            .collect(Collectors.toMap(p -> p, myVariable.get(Function.identity()).stream().filter(predicate).collect(Collectors.toList())));

共有1个答案

井学
2023-03-14

可以使用两个筛选器调用:

Map<String, List<Person>> result = myVariable.entrySet()
        .stream()
        .map(entry -> Map.entry(entry.getKey(), entry.getValue()
                .stream().filter(p -> p.getAge() > 20)
                .collect(Collectors.toList())))
        .filter(entry -> !entry.getValue().isEmpty())
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

如果您使用的是Java8,请将map.entry()替换为new abstractMap.simpleentry()

 类似资料:
  • 我有两个列表,我必须从它们创建一个地图。首先,我在迭代for loop,其次,我想通过一个stream和collect来映射,但我不知道在这种情况下如何使用collectors.tomap。有可能吗?

  • 问题内容: 我正在尝试使用数组映射进一步过滤对象,以准备将其发送到服务器进行保存。我可以过滤为1个键值,这很不错,但是我想更进一步,将其与布尔值内部进行比较。 所以,现在这就是我所拥有的- 这对于拉出id很有用,但是如果它们的选定值== false,我不想将它们压入这个新数组中,因此我将一个条件作为进一步过滤条件。这有点奏效,我得到了一个id数组,但是具有.selected == false的id

  • 如何过滤

  • 我使用静态编程语言反射来检查具有特定注释的属性是否为空。 给出以下示例: 以及检查它的函数: 这个想法是,函数将迭代我的类的属性,检查它们是否有注释,并检查值是否为空。如果属性是一个数据类,代码会递归地计算Childs的属性。 之后,我映射结果,将KProperty转换为一个简单的字符串,该字符串可供人阅读,包含类名和属性名。 问题是上面的代码没有按预期工作。返回的属性只是来自第一级类的属性。 如

  • 我有一个问题,希望有人能帮助我提高Java流API的知识。 我的服务通过RabbitMQ以如下数组的形式从另一个服务接收数据: 我需要对这些数据做的是将其收集到用户具有userId的列表和设备id的列表中。因此,从上面的数据来看,它应该是: 我确实有一个可行的解决方案,但它很笨拙 解决方案是: 如何对流执行相同的操作?谢谢