如何有条件地设置变量值

我正在尝试根据条件设置变量值,我想知道在 Java 8 中是否有更好的方法来做到这一点,而不是使用多个 if else 或 switch 语句。

我需要根据字符串值设置请求编号

123 为 foo, 123 酒吧, 456 为 xyz, 000 作为默认值,即任何其他字符串值。

if(someString.equalsIgnorecase("foo")){
x = someObj.setRequestNumber(123);
}

else if(someString.equalsIgnorecase("bar")){
x = someObj.setRequestNumber(123);
}

else if(someString.equalsIgnorecase("xyz")){
x = someObj.setRequestNumber(456);
}

else{
x = someObj.setRequestNumber(000);
}
gouridetongxingzheng 回答:如何有条件地设置变量值

试试这个:

switch (someString.toUpperCase()) {
  case "XYZ":
    myNum = 1;
    break;
  case "FOO":
    myNum = 2;
    break;
  case "BAR":
  case "ANOTHER_BAR":
    myNum = 3;
    break;
  default:
    myNum = -1;
    break;
}

编辑:如果两者都意味着相同的结果,则仅添加了一个示例。使用新的 Switch 特性(JDK 14、15、16),您甚至可以简化 Switch 语句!链接:https://openjdk.java.net/jeps/361

,

首先,您可以将前两个 if 语句替换为一个:

if (someString.equalsIgnorecase("foo") || someString.equalsIgnorecase("bar")) {
    x = someObj.setRequestNumber(123);
} else if (someString.equalsIgnorecase("xyz")) {
    x = someObj.setRequestNumber(456);
} else {
    x = someObj.setRequestNumber(000);
}

另一种方法是创建一个 Map,并从地图中查找结果:

Map<String,Integer> map = Map.of("foo",123,"bar","xyz",456);

x = map.getOrDefault(someString.toLowerCase(),0);

(注意:Map.of(...) 是在 Java 9 中添加的,如果您使用的是早期版本的 Java,则必须使用 map.put("foo",123); 等单独添加元素)。

,

注意:代码已更新,在询问连接到特定键的值时添加了 toLowerCase。顺便说一下,一个键应该是唯一标识的,OP 应该决定是对键使用小写还是大写,而不是更改代码进行忽略大小写比较。

您可以创建一个 Map<String,Integer> 并使用它来设置您的值(此解决方案也适用于旧版本的 java,最终对于 java 5 之前的版本不使用泛型):

// Init the map with the values for each key
Map<String,Integer> values = new HashMap<>();
values.put("foo",123);
values.put("bar",123);
values.put("xyz",456);

// Use the values map to set your value 
someObject.setRequestNumber(value.getOrDefault(someString.toLowerCase(),0));

如果值映射中不存在任何键,则使用 getOrDefault 方法设置默认值:

返回指定键映射到的值,如果此映射不包含键的映射,则返回 defaultValue。

请注意,如果您需要将值 000 指定为默认值,则这不是 n int。它必须设置为 String 以保存所有三个零。将其更改为字符串很简单,只需将代码更改如下:

// Init the map with the values for each key
Map<String,String> values = new HashMap<>();
values.put("foo","123");
values.put("bar","123");
values.put("xyz","456");

// Use the values map to set your value 
// The method setRequestNumber must receive a String
someObject.setRequestNumber(value.getOrDefault(someString,"000"));

作为使用 switch 的替代方法,最好的方法是创建一个如下所示的方法(自 Java 7 起):

 public String getValueFromKey(String key) {
    switch(key.toLowerCase()) {
        case "foo":
        case "bar":      // You can combine multiple case
           return "123"; // You can exit directly with a return instead 
                         // of saving the result in a variable and use a break
        case "xyz":
           return "456";
        default:         // Use the default to set the handle any value not previously handled  
           return "000";  
 }

 ...
 someObj.setRequestNumber(getValueFromKey(someString));
,

使用地图。

初始化:

   Map<String,Integer> map = new HashMap<>();
   map.put("foo",123);
   map.put("bar",123);
   map.put("xyz",456);
    :

使用:

Integer req = map.get(someString.toLowerCase());
if (req != null)
     someObj.setRequestNumber(req);
else
     error("....!");

这在其他地方为了简单起见而牺牲了一些初始化代码,如果您必须进行“许多”这样的查找并有“许多”字符串要查找,这是值得的。

,

您可以使用地图

 Map<String,Integer> map = new HashMap<>();
        map.put("foo",123);
        map.put("bar",123);
        map.put("xyz",456);
        
        x= map.get(someString);

当面临很多情况时,看看是否可以应用多态。 https://refactoring.com/catalog/replaceConditionalWithPolymorphism.html

本文链接:https://www.f2er.com/10111.html

大家都在问