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

如何使用流将所有映射键值连接到一个字符串中,并对每个值进行替换?

苗信鸥
2023-03-14
forLoop: --name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name1 "value1"
resetAllValues: --name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name1 "value1"
streamy: --name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name1 "value1"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name1 "value1"
package working;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class Temp {
   public static void main(String[] cmd_lineParams) {
      Map<String, String> map = new HashMap<>(5);
      map.put("name1", "value1");
      map.put("name2", "{\"x\": \"y\"}");
      map.put("name3", "value3");
      map.put("name4", "value4");
      map.put("name5", "value5");
      forLoop(map);
      resetAllValues(new HashMap<String, String>(map));
      streamy(new HashMap<String, String>(map));
   }
   private static final Matcher matcher = Pattern.compile("\"").matcher("ignored input");
   private static final void forLoop(Map<String, String> map) {
      StringBuilder builder = new StringBuilder();
      for(Map.Entry<String, String> entry : map.entrySet()) {
         String value = matcher.reset(entry.getValue()).replaceAll("\\\\\"");
         builder.append("--").append(entry.getKey()).append(" \"").append(value).append("\"");
      }
      System.out.println("forLoop: " + builder.toString());
   }
   private static final void resetAllValues(Map<String, String> map) {
      map = map.entrySet().stream()
         .collect(Collectors.toMap(entry -> entry.getKey(),
                                   entry -> matcher.reset(entry.getValue()).replaceAll("\\\\\\\"")));
      StringBuilder builder = new StringBuilder();
      for(Map.Entry<String, String> entry : map.entrySet()) {
         builder.append("--").append(entry.getKey()).append(" \"").append(entry.getValue()).append("\"");
      }
      System.out.println("resetAllValues: " + builder.toString());
   }
   private static final void streamy(Map<String, String> map) {
      StringBuilder builder = new StringBuilder();
      map.forEach((k,v) -> builder.append(
         builder.append("--").append(k).append(" \"").append(
            matcher.reset(v).replaceAll("\\\\\"")).append("\"")));
      System.out.println("streamy: " + builder.toString());
   }
}

(我九岁的孩子说我需要在这个问题的某个地方说“困难”。所以:困难。)

共有1个答案

拓拔曦
2023-03-14

我想既然你说了困难,我就得回答这个!:)

map.entrySet().stream().map((entry) -> //stream each entry, map it to string value
            "--" + entry.getKey() + " \"" + entry.getValue().replaceAll("\"", "\\\\\"") + "\"")
            .collect(Collectors.joining(" ")); //and 'collect' or put them together by joining

我个人不喜欢使用流,因为它变得很难看,非常快,但它对更简单的循环有用。(例如,用某个字符联接所有值)但是,通过使用ParallelStream()而不是Stream()可以轻松地将其并行化

如果您希望值按某种顺序排列,这样它就不是那么随机(就像hashmap那样),您可以在map之前进行排序:

.stream().sort((e1, e2) -> e1.getValue().compareTo(e2.getValue()))
.map(...)...
 类似资料:
  • 假设我有一个,我想替换一个值映射,例如: 顺便说一下,字符串也可以是多个字符

  • 嗨,我尝试将以下Source类映射到以下Destation类。我使用了以下映射以将字符串值映射到列表字符串。它没有正确映射。我需要知道如何使用Dozer将2个字符串值映射到一个目标字符串列表中。

  • 问题内容: 我需要将单行的所有而不是空值放入一个字符串中,例如 表: 导致: 重要说明-我不知道字段名称/类型,因此它应该遍历所有字段,并且所有非null值都将添加到列表中。 看起来它可以使用xquery做到这一点,但找不到正确的语法。有什么提示吗? 谢谢! 问题答案: select T2.N.value(‘local-name(.)’, ‘nvarchar(128)’)+’: ‘+ T2.N.v

  • 问题内容: 我是Java编程的新手。我创建了一个包含我的键值对的哈希映射,可用于将用户输入替换为对应于各个键的值。 即 我在公式评估中使用它 注意 :为用户提供了特定公式的特定输入方式(值1 +值2 +值3) 我正在使用(value1 value2 value3)并将其转换为(value1key value2key value3key) 更新: 我现在更好地理解该问题旨在帮助更好地了解如何利用哈希

  • 我试图将一个键的值链接到另一个键的值,但似乎无法使其工作。 例如,如果我创建一个哈希映射,我希望能够创建一个键值对,比如(“x”,0)。然后,我希望能够将另一个键值对值添加到第一个键值对中,因此,如果我有(“x”,map.get(“y”))和(“y”,0),我希望能够以某种方式将其链接起来,这样,如果我现在更新y,使其(“y”,10),map。得到(“x”);也应该返回10。 我不知道如何让这个工

  • 假设我有以下工作的lambda表达式: 我想在过滤器语句之前创建一个具有2个值的流。所以我想做一个映射,但仍然保留原始值。我想实现这样的事情: 这可能与Java8流?我已经看了收集(GroupingBy()),但仍然没有成功。