Java -使用Lambda替换字符

vojdkbi0  于 2022-12-25  发布在  Java
关注(0)|答案(4)|浏览(350)

在这段代码中,我试图用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);
  }
}
yi0zb3m4

yi0zb3m41#

  • 首先,您正在替换而不是赋值,要获得正确的替换字符串,您需要在替换后将其赋值给变量,例如:

名称=名称.replaceFirst(“0”,v.到字符串());

  • 并且您希望在foreach内部使用lambda表达式执行此操作,但这在您的情况下不起作用,为了使此操作起作用,您需要对以下代码进行更改,以实现所需的结果:
  • 在您的情况下,无法保证顺序,如果您希望按顺序进行,可以使用LinkedHashMap
public static void main(String[] args) {
      final 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[0] = name[0].replaceFirst("0", v.toString());
      });
      System.out.println(name[0]);

  }
  • 因为您的代码需要多次替换才能获得所需结果,而您无法在lamda表达式中使用同一变量多次赋值,因为lamda语句需要使用有效的最终变量,否则将出错
  • 所以你能做的就是把name作为final数组,并在lamba语句中使用,就像我在上面的代码示例中提到的那样。
zkure5ic

zkure5ic2#

replaceFirst不会替换name字符串中的子字符串;它会返回一个新的String和修改。第一个替换(字符串,%20字符串)

fnatzsnv

fnatzsnv3#

如果你想用Value1替换第一个零,用Value2替换第二个零,等等,它不会起作用。
不能保证元素在迭代过程中会保持原来的顺序,这完全是关于散列,因为你使用的是HashMap
...该类不保证Map的顺序;特别是,它不能保证顺序将随时间保持不变。
参见docs

  • 您似乎不需要此数据结构来执行任务 *。

相反,您可以使用ArrayList,其中的所有元素将在迭代时排序(正如您所放置的那样)。

List<String> valuesForReplacement = new ArrayList<>();
valuesForReplacement.add("Value1");
valuesForReplacement.add("Value2");
valuesForReplacement.add("Value3");
valuesForReplacement.add("Value4");

for (String value : valuesForReplacement) {
   name = name.replaceFirst("0", value);
}
yzuktlbb

yzuktlbb4#

请考虑此代码:

public static void main(String[] args) {
        AtomicReference<String> name = new AtomicReference<>("(call SP_PKG.GETINFOTYPE(0, 0, 0, 0))");
        Map<String, String> params = new TreeMap<>();
        params.put("Param1", "Value1");
        params.put("Param2", "Value2");
        params.put("Param3", "Value3");
        params.forEach((key, value) -> name.set(name.get().replaceFirst("0", value)));
        System.out.println(name.get());
    }

输出:

(call SP_PKG.GETINFOTYPE(Value1, Value2, Value3, 0))
  • HashMap不提供排序,在这种情况下是必不可少的。所以我选择使用TreeMap代替。由于不使用Map键,您也可以使用List接口的任何实现

你写道:
是否有一种方法可以使用lambda来完成此操作,而不是编写循环通过每个条目并替换的传统代码。
(key名称.集合(名称. get(). replaceFirst("0",值))

  • 这是lambda表达式的使用。我们在这里提供BiConsumer<? super K, ? super V> action的实现。可能你想使用Steam API,但没有必要。在这种情况下,我们正在修改单个对象。
  • 您提供的示例代码不起作用,因为replaceFirst方法返回修改后的String,并且您的代码中没有重新分配name变量引用。
  • 我还使用了AtomicReference<String>,而不是String来表示变量name,因为在lamdas中修改的变量必须是final的(参见JLS § 15.27.2)。

对有效final变量的限制禁止了对动态变化的局部变量的访问,捕获这些变量可能会引入并发问题。

相关问题