【问题标题】:Java 8 map filter and sortJava 8 地图过滤和排序
【发布时间】:2025-12-18 16:20:07
【问题描述】:

我想将此示例迁移到 Java 8:

Map<String, String> data = new HashMap<String, String>() {{
    put("name", "Middle");
    put("prefix", "Front");
    put("postfix", "Back");
}};

    String title = "";
    if (data.containsKey("prefix")) {
    title += data.get("prefix");
}

if (data.containsKey("name")) {
    title += data.get("name");
}

if (data.containsKey("postfix")) {
    title += data.get("postfix");
}

正确的输出:

FrontMiddleBack

我尝试使用 entryset -> 流,但它没有以正确的顺序返回。

String titles = macroParams.entrySet().stream()
        .filter(map -> "name".equals(map.getKey()) || "postfix".equals(map.getKey()) || "prefix".equals(map.getKey()))
        .sorted()
        .map(Map.Entry::getValue)
        .collect(Collectors.joining());

输出:

MidleFrontBack

我可以使用 Java 8 获得相同的结果吗?

【问题讨论】:

  • 您的原始代码已损坏。 concat() 不会修改它所调用的字符串。
  • HashMap 是无序的。如果您想保留顺序,请使用LinkedHashMap
  • 我尝试迁移到 java 8。 Java 8 向后兼容。您不必因为更新了 Java 而更改每一行(或任何一行)代码。

标签: java dictionary filter java-8 java-stream


【解决方案1】:

IMO,流在这里有点矫枉过正。但是你仍然可以使用 Java 8 来发挥你的优势,Map.getOrDefault():

String title = data.getOrDefault("prefix", "")
        + data.getOrDefault("name", "")
        + data.getOrDefault("postfix", "");

【讨论】:

    【解决方案2】:

    您可以流式传输所需的键并连接存在的值:

    String title = Stream.of("prefix", "name", "postfix")
            .filter(data::containsKey)
            .map(data::get)
            .collect(joining());
    

    【讨论】:

    • 非常好。您可以通过在 get() 之后过滤 null 来避免额外的查找。