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

如何用Java流api过滤地图?

冉俊德
2023-03-14
Map<Integer, String> map = new HashMap<>();
  map.put(1, "f");
  map.put(2, "I");
  map.put(3, "a");
  map.put(4, "c");....etc

现在我有一个列表:

List<Integer> picks = {1,3}

我想得到一个字符串列表,即从map中匹配键值的值,在' pick '列表中找到。所以,我期望得到结果{"f "," a"}。有没有办法用java stream api优雅地做到?

当有一个值时,我会这样做:

map.entrySet().stream()
   .filter(entry -> "a".equals(entry.getValue()))
   .map(entry -> entry.getValue())
   .collect(Collectors.toList())

但是,当有一个键/选择列表要过滤时,就很难了。

共有3个答案

江华容
2023-03-14

您不需要遍历整个地图来收集选择的值。而是遍历所需的键并从地图中获取相关的值。如果地图比您需要选择的值大得多(通常情况下),那么这种方法应该优于其他方法。此外,这种解决方案更紧凑,对我来说视觉混乱更少。看起来是这样的。

List<String> pickedValues = picks.stream().map(map::get)
    .filter(Objects::nonNull)
    .collect(Collectors.toList());
窦夜洛
2023-03-14

您可以通过使用这样的东西来实现这一点:

List<String> values = map.entrySet()
                .stream()
                .filter(entry -> picks.contains(entry.getKey()))
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());

values.forEach(System.out::println);

输出:

f
a

但是,由于< code>List::contains是O(N ),所以它可能效率不高。考虑对< code>picks使用< code>Set(例如< code>HashSet)而不是< code>List,因为< code>HashSet::contains是O(1)。

居和顺
2023-03-14

您可以在Stream#filter中使用List.contains()来仅接受列表中存在的那些值:

List<String> result = map.entrySet()
   .stream()
   .filter(ent -> picks.contains(ent.getKey()))
   .map(Map.Entry::getValue)     
   .collect(Collectors.toList());
 类似资料:
  • 我有两个简单的POJOs: 然后我生成一些数据,我为父母添加100个孩子: 我的目标是移除所有10岁以下的儿童: 最后,我列出了十岁以上的孩子。但是我不想写一个单独的方法。 如何得到所有的父母与名单上的孩子十岁以上只使用单一流?

  • 问题内容: 您如何先分组然后使用Java流应用过滤? 示例 :考虑此类:我想按部门分组,列出薪水大于2000的雇员。 这就是我可以做到的 输出量 由于B部门中没有雇员的薪水高于2000。因此B部门没有密钥: 但是实际上,我想使用空列表作为密钥– 预期产量 我们应该怎么做? 问题答案: nullpointer的答案显示了直接的方法。如果您不能更新到Java 9,没问题,那么这个收集器就没有魔力。这是

  • 我有一个员工类,有薪水和部门,还有一份员工名单。 我需要找到至少有30名员工支付至少100美元工资的部门数量。 到目前为止,我已经得到了每个部门的员工数量。但是我不知道如何应用过滤器。 任何帮助都将不胜感激。

  • 我必须通过一个映射过滤对象集合,该映射包含对象字段名和字段值的键值对。我正在尝试按stream()应用所有过滤器。过滤器()。 对象实际上是JSON,因此映射包含其变量的名称以及它们必须包含的值,以便被接受,但出于简单的原因,并且由于与问题无关,我编写了一个简单的Testclass来模拟行为: 到目前为止我所尝试的: 我试着将地图的每个部分放在第一位,将集合的流放在第一位,但这两种解决方案都没有按

  • 我有一个Java地图,我想转换和过滤。作为一个简单的例子,假设我想将所有值转换为整数,然后删除奇数项。 这是正确的,并生成: 但是,我不禁想知道是否有一种方法可以避免两次调用。 有没有一种方法,我可以同时执行转换和筛选操作,并且在结束时只调用一次?

  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(