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

在地图上使用流并查找/替换值

步炯
2023-03-14

我是streams的新手,我试图在这个映射中筛选键/值对中的第一个真值,然后我想返回字符串键,并用false替换真值。

我有一个字符串/布尔值的地图:

 Map<String, Boolean> stringMap = new HashMap<>();
 //... added values to the map

 String firstString = stringMap.stream()
        .map(e -> entrySet())
        .filter(v -> v.getValue() == true)
        .findFirst()
 //after find first i'd like to return
 //the first string Key associated with a true Value
 //and I want to replace the boolean Value with false.

这就是我卡住的地方——我可能也做错了第一部分,但是我不确定如何在同一个流中返回字符串值和替换布尔值?我打算在这里尝试使用收集来处理返回值,但是我想如果我这样做了,它可能会返回一个Set,而不仅仅是字符串。

我可以这样做,但我更愿意尝试返回字符串。我还想知道是否应该在这里使用可选变量,而不是String firstString局部变量。我一直在复习类似的问题,但我没法做到这一点,我有点不知所措。

这里有一些我已经检查过的类似问题,我不能在这里应用它们:

使用lambdas和流按值排序映射

使用stream修改地图

共有2个答案

陈康胜
2023-03-14
Optional<String> firstString = stringMap.entrySet().stream()
         .filter( v-> v.getValue() == true )
         .map( e -> e.getKey())
         .findFirst();

你的行动顺序似乎取消了。

stringMap。entrySet()。stream()

在地图上,您可以对密钥集、条目集或值集合进行流式处理。因此,请确保对条目集进行流式处理,因为您需要访问用于返回的键和用于筛选的值。

过滤器(v-)

接下来过滤条目流,以便只保留具有真值的条目。

. map(e-

现在将条目流映射到其键的String值。

. findFirst();

找到第一个值为true的键。请注意,哈希映射中的条目没有特定的顺序。find first操作的结果正如您前面提到的,是一个可选值。

郭星文
2023-03-14

Map没有stream()方法,也没有您的。map()真的没有意义。在这种情况下,entrySet()是什么?最后,findFirst()返回一个Optional,因此您可以更改变量,或者打开Optional

您的代码可能如下所示:

String first = stringMap.entrySet().stream()
    .filter(Map.Entry::getValue) // similar to: e -> e.getValue()
    .map(Map.Entry::getKey)      // similar to: e -> e.getKey()
    .findFirst()
    .orElseThrow(); // throws an exception when stringMap is empty / no element could be found with value == true

还请注意,“第一”元素在地图上下文中没有真正意义。因为普通映射(比如HashMap)没有定义的顺序(除非使用SortedMap比如TreeMap)。

最后,您不应该在流式传输时修改输入映射。找到“第一个”值。然后简单地做:

stringMap.put(first, false);
 类似资料:
  • 有没有一种方法可以在android studio或使用命令行脚本中找到并替换一个单词在整个项目中出现的所有情况(而不仅仅是使用refactor->rename的单个类),同时还可以维护大小写? 例如,供应商必须到商户,供应商->商户,供应商->商户。我的老板希望我更改供应商与商人的项目我正在工作的所有实例。我做了大约一个小时,我知道我在浪费时间。让我知道任何时候保存的建议。

  • 问题内容: 我想替换所有我的Elasticsearch索引文档中的单个用户名。是否有API查询? 我尝试搜索多个但找不到。有人知道吗? 我的情况: 我在名为“ test”的索引中具有上述数据,并键入“ movies”。在这里,我想用“ alice”代替所有的“ bob”名称。 谢谢 问题答案: 通过查询更新是解决之道。 注意:请确保启用动态脚本,以使其起作用。

  • 查找工具栏 快捷键 Mac: Command + F Windows\/Linux: Ctrl + F 先选中复制,然后调出查找工具栏,选中部分就被自动填入搜索框,按回车键快速搜索。 操作步骤(快捷键): Command + C (复制单词) Command + F (调出查找工具栏) Enter (回车开始查找) 在查找结果中跳转 下一个匹配到的结果 快捷键: Mac: Command + G

  • 在Atom中,对你文件或者项目中的文本进行查找或者替换,非常快速而且容易。 cmd-F 在缓冲区中查找 cmd-shift-f 在整个项目中查找 如果你执行了这些命令,你屏幕的底部会出现一个“Find and Replace”面板。 你可以按下cmd-F,输入需要搜索的字符串,并且多次按下回车(或者cmd-G,或者“Find Next”按钮)来在当前文件中搜索,循环查找当前文件中的匹配内容。“Fi

  • 我有一个任务:返回一个公司地图,其中键是它的名称,值是存储为String的员工列表,由和组成,用空格分隔。这是我的解决方案和它的工作罚款: 所以我的问题是,如何转换

  • 操作步骤: 菜单栏: Refactor —> Find and Replace Code Duplicates...