使用java 8流将String替换为hashmap值

时间:2016-03-23 07:54:21

标签: java hashmap java-8 java-stream

我有以下代码StringHashMap

Map<String, String> map = new HashMap<>();
    map.put("ABC", "123");
    String test = "helloABC";
    map.forEach((key, value) -> {
        test = test.replaceAll(key, value);
    });

我尝试用HashMap值替换字符串,但这不起作用,因为test是最终的,无法在forEach的正文中重新分配。

那么有没有使用Java 8 Stream API将String替换为HashMap的解决方案?

2 个答案:

答案 0 :(得分:3)

由于仅使用forEach()无法进行此操作(message必须有效最终),解决方法可能是创建一个存储单个{{1}的最终容器(例如List)重写:

String

请注意,我将final List<String> msg = Arrays.asList("helloABC"); map.forEach((key, value) -> msg.set(0, msg.get(0).replace(key, value))); String test = msg.get(0); 更改为replace(),因为前者与正则表达式一起使用,但是根据您的代码进行判断似乎需要用字符串本身替换(不要担心,尽管名称混乱,它也会替换< em>所有次出现。)

如果您想要完整的Stream API,可以使用reduce()操作:

replaceAll()

但请注意,这种减少只能在串行(非并行)流中正常工作,其中从不调用组合器函数(因此可能是任何)。

答案 1 :(得分:3)

这类问题不适合Streams API。 Streams的当前版本主要针对可以并行的任务。也许将来会增加对此类操作的支持(参见https://bugs.openjdk.java.net/browse/JDK-8133680)。

您可能会感兴趣的一种基于流的方法是减少函数而不是字符串:

Function<String, String> combined = map.entrySet().stream()
    .reduce(
        Function.identity(),
        (f, e) -> s -> f.apply(s).replaceAll(e.getKey(), e.getValue()),
        Function::andThen
    );

String result = combined.apply(test);