如何在Java8流API中有条件地修改映射?

如何在Java8流API中有条件地修改映射?,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我正试图根据条件逻辑和逻辑修改映射的键。我不熟悉Java8StreamsAPI。假设我有一张这样的地图: Map<String, String> map = new HashMap<>(); map.put("PLACEHOLDER", "some_data1"); map.put("Google", "some_data2"); map.put("Facebook", "some_data3"); map.put("Microsoft", "some_data4");

我正试图根据条件逻辑和逻辑修改
映射
的键。我不熟悉Java8StreamsAPI。假设我有一张这样的地图:

Map<String, String> map = new HashMap<>();

map.put("PLACEHOLDER", "some_data1");
map.put("Google", "some_data2");
map.put("Facebook", "some_data3");
map.put("Microsoft", "some_data4");

我发现这让我觉得也许我不能用Java8流API做到这一点。希望有比我更在行的人知道怎么做。如果你想玩它。

你已经过滤掉了所有不是
占位符的元素。您需要将该过滤逻辑添加到
映射
操作中:

final Map<String, String> output = input.entrySet().stream()
        .map(e -> {
            if (!e.getKey().equals("PLACEHOLDER")) {
                return e;
            }
            if (condition) {
                return new AbstractMap.SimpleImmutableEntry<>("Apple", e.getValue());
            }
            return new AbstractMap.SimpleImmutableEntry<>("Netflix", e.getValue());
        }).collect(toMap(Map.Entry::getKey, Map.Entry::getValue));

您已经过滤掉了所有不是
占位符的元素。您需要将该过滤逻辑添加到
映射
操作中:

final Map<String, String> output = input.entrySet().stream()
        .map(e -> {
            if (!e.getKey().equals("PLACEHOLDER")) {
                return e;
            }
            if (condition) {
                return new AbstractMap.SimpleImmutableEntry<>("Apple", e.getValue());
            }
            return new AbstractMap.SimpleImmutableEntry<>("Netflix", e.getValue());
        }).collect(toMap(Map.Entry::getKey, Map.Entry::getValue));

如果您确实想使用
Stream
s执行此操作,只需将条件逻辑移动到收集阶段,如下所示:

boolean condition = true;
map.entrySet().stream().collect(Collectors.toMap(
        entry -> mapKey(entry.getKey(), condition), Map.Entry::getValue
));
其中:

private static String mapKey(String key, boolean condition) {
    if (!"PLACEHOLDER".equals(key)) {
        return key;
    }
    if (condition) {
        return "Apple";
    } else {
        return "Netflix";
    }
}

但是,使用
Map.remove
Map.put
的第二部分似乎是最好的方法。

如果您真的想使用
Stream
s,只需将条件逻辑移到收集阶段,如下所示:

boolean condition = true;
map.entrySet().stream().collect(Collectors.toMap(
        entry -> mapKey(entry.getKey(), condition), Map.Entry::getValue
));
其中:

private static String mapKey(String key, boolean condition) {
    if (!"PLACEHOLDER".equals(key)) {
        return key;
    }
    if (condition) {
        return "Apple";
    } else {
        return "Netflix";
    }
}

但是,使用
Map.remove
Map.put
的第二部分似乎是最好的方法。

你能进一步澄清一下吗,你想更改键还是值?@YCF_L键,这让事情变得有点奇怪。在这种情况下,你能编辑你的问题吗?“…并有条件地将其值更改为其他值”是什么引起了混乱。通常这意味着“更改与该键相关的值”。如果您解决了问题,请告知我们。如果您这样做了,请给出最有帮助的答案,或者添加您自己的答案,解释您是如何解决的。请您进一步澄清,您想更改键还是值?@YCF_L更改键,这会让事情变得有点奇怪。在这种情况下,请您编辑您的问题-“…并有条件地将其值更改为其他值。”是什么引起了混乱。通常这意味着“更改与该键相关的值”。如果您解决了问题,请告知我们。如果你这样做了,请给出最有用的答案,或者添加你自己的答案,解释你是如何解决的。我认为你在键映射函数中使用魔法的方法比我基于
map
的方法更简洁。我认为你在键映射函数中使用魔法的方法比我基于
map
的方法更简洁。