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

用流变换和过滤Java图

谭彦
2023-03-14

我有一个Java地图,我想转换和过滤。作为一个简单的例子,假设我想将所有值转换为整数,然后删除奇数项。

Map<String, String> input = new HashMap<>();
input.put("a", "1234");
input.put("b", "2345");
input.put("c", "3456");
input.put("d", "4567");

Map<String, Integer> output = input.entrySet().stream()
        .collect(Collectors.toMap(
                Map.Entry::getKey,
                e -> Integer.parseInt(e.getValue())
        ))
        .entrySet().stream()
        .filter(e -> e.getValue() % 2 == 0)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));


System.out.println(output.toString());

这是正确的,并生成:{a=1234,c=3456}

但是,我不禁想知道是否有一种方法可以避免两次调用.entrySet().stream()

有没有一种方法,我可以同时执行转换和筛选操作,并且在结束时只调用.collection()一次?

共有1个答案

张亦
2023-03-14

是的,您可以将每个条目映射到另一个临时条目,该临时条目将保存键和解析的整数值。然后可以根据每个条目的值对其进行筛选。

Map<String, Integer> output =
    input.entrySet()
         .stream()
         .map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), Integer.valueOf(e.getValue())))
         .filter(e -> e.getValue() % 2 == 0)
         .collect(Collectors.toMap(
             Map.Entry::getKey,
             Map.Entry::getValue
         ));

注意,我使用了integer.valueof而不是parseint,因为我们实际上需要一个装箱的int

如果您有权使用StreamEx库,那么您可以非常简单地做到这一点:

Map<String, Integer> output =
    EntryStream.of(input).mapValues(Integer::valueOf).filterValues(v -> v % 2 == 0).toMap();
 类似资料:
  • 我有一个名为的类,用它描述活动及其开始时间和结束时间。这些属性是、、。我必须使用流对这些活动进行分组和过滤,这些活动的总持续时间超过10小时。我成功地计算了持续时间的总和,并根据活动将它们分组:

  • 我有两个简单的POJOs: 然后我生成一些数据,我为父母添加100个孩子: 我的目标是移除所有10岁以下的儿童: 最后,我列出了十岁以上的孩子。但是我不想写一个单独的方法。 如何得到所有的父母与名单上的孩子十岁以上只使用单一流?

  • 有没有办法把这两条流合并成一条?我使用第一个流在嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以用一条流来实现这一点。 像这样的

  • 现在我有一个列表: 我想得到一个字符串列表,即从map中匹配键值的值,在' pick '列表中找到。所以,我期望得到结果{"f "," a"}。有没有办法用java stream api优雅地做到? 当有一个值时,我会这样做: 但是,当有一个键/选择列表要过滤时,就很难了。

  • 将此流收集到列表中 正如我所看到的,infinity循环有一些问题,所以peek()打印范围内的数字(12,99),这是可以的,但之后它再次打印范围内的数字(11,98),等等,你能解释一下我在哪里犯了错误吗?

  • 问题内容: 我有一个字符串集合,我想将其转换为全部为空或为null的字符串集合,并删除所有字符串,并修剪所有其他字符串。 我可以分两步来做: 但是,是否有番石榴方法将两个动作组合为一个步骤? 问题答案: 在 即将发布的 最新版本的Guava(12.0)中,将有一个名为FluentIterable的类。此类为此类内容提供了缺少的流畅API。 使用FluentIterable,您应该可以执行以下操作: