在这段代码中,我试图用Map中的值替换所有的0,但是没有用。有没有办法用lambdas来完成这个任务,而不是编写传统的代码,循环遍历每个条目并进行替换。
import java.util.Map;
import java.util.HashMap;
class Main {
public static void main(String[] args) {
String name = "(call SP_PKG.GETINFOTYPE(0, 0, 0, 0))";
Map<String, String> params = new HashMap<String, String>();
params.put("Param1", "Value1");
params.put("Param2", "Value2");
params.put("Param3", "Value3");
System.out.println("Hello");
params.forEach((k,v) -> name.replaceFirst("0", v.toString()));
System.out.println(name);
}
}
4条答案
按热度按时间yi0zb3m41#
名称=名称.replaceFirst(“0”,v.到字符串());
zkure5ic2#
replaceFirst不会替换
name
字符串中的子字符串;它会返回一个新的String
和修改。第一个替换(字符串,%20字符串)fnatzsnv3#
如果你想用
Value1
替换第一个零,用Value2
替换第二个零,等等,它不会起作用。不能保证元素在迭代过程中会保持原来的顺序,这完全是关于散列,因为你使用的是
HashMap
。...该类不保证Map的顺序;特别是,它不能保证顺序将随时间保持不变。
参见docs。
相反,您可以使用
ArrayList
,其中的所有元素将在迭代时排序(正如您所放置的那样)。yzuktlbb4#
请考虑此代码:
输出:
HashMap
不提供排序,在这种情况下是必不可少的。所以我选择使用TreeMap
代替。由于不使用Map键,您也可以使用List
接口的任何实现你写道:
是否有一种方法可以使用lambda来完成此操作,而不是编写循环通过每个条目并替换的传统代码。
(key名称.集合(名称. get(). replaceFirst("0",值))
BiConsumer<? super K, ? super V> action
的实现。可能你想使用Steam API
,但没有必要。在这种情况下,我们正在修改单个对象。replaceFirst
方法返回修改后的String
,并且您的代码中没有重新分配name
变量引用。AtomicReference<String>
,而不是String来表示变量name
,因为在lamdas中修改的变量必须是final的(参见JLS § 15.27.2)。对有效final变量的限制禁止了对动态变化的局部变量的访问,捕获这些变量可能会引入并发问题。