最简洁的方式来表达这个Java条件而不检查值两次

时间:2016-10-10 13:20:25

标签: java control-flow

我有一个变量x

我希望仅在 m()是两个可能值之一时调用方法x

调用m()时,我想向其传递一个参数,其值取决于x的值。

有没有办法在Java中执行此操作而不必多次检查x的值,并且只在一个地方调用/写m()(即不在{{1的多个分支中)声明)?

我很有趣的一个解决方案:

if

但我不禁觉得这是技术上两次检查switch (x) { case 1: y = "foo"; break; case 2: y = "bar"; break; default: y = null; break; } if (y != null) m(y); ,只是通过为第二次检查添加“代理”来掩盖这一事实。

(澄清为什么约束是它们的原因:在阅读代码时,我很难理解在分支之间存在高度重复时分支很多的逻辑 - 它变成了“发现差异”的游戏而不是简单地能够看到正在发生的事情。我宁愿积极地重构这种重复,这是一种习惯,在Ruby,JS和其他语言中很好地服务于我;我希望我能学会为Java做同样的事情并使代码更容易让我和其他人一目了然。)

4 个答案:

答案 0 :(得分:3)

我不确定你想做什么,但你可以使用地图来获得“' y'来自' x'

的参数
Map<Integer, String> map = new HashMap<>();
map.put(1, "foo");
map.put(2, "bar");

if (map.containsKey(x)) {
    m(map.get(x));
}

答案 1 :(得分:1)

使用“转到”或等效物:

void do_m_if_appropriate() {

  // x and y are assumed to be eg. member variables

  switch (x) {

    case 1:
      y = "foo";
      break;

    case 2:
      y = "bar";
      break;

    default:
      return; // this is the "goto equivalent" part
  }

  m(y);
}

上面很优雅。如有必要,将其更改为返回truefalse也是微不足道的,具体取决于它是m()还是y还是null

你也可以用循环结构做一些技巧,虽然有些人可能会说这是滥用循环结构,你应该相应地评论它:

do { // note: not a real loop, used to skip call to m()
  switch (x) {

    case 1:
      y = "foo";
      break;

    case 2:
      y = "bar";
      break;

    default:
      continue; // "goto equivalent" part
  }

  m(y);
} while(false);

答案 2 :(得分:1)

以下是Optionals的解决方案(我的Java语法可能稍微不正确)。请注意,对于您来说,代码看起来是这样,但实现明智,它类似于您发布的示例(即检查y是否为异常值)。

switch (x) {
  case 1:
    y = Optional<String>.of("foo");
    break;
  case 2:
    y = Optional<String>.of("bar");
    break;
  default:
    y = Optional<String>.empty();
    break;
}
y.map((m's class)::m);
result = y.orElse( <value result should take if x was invalid> );

实际上,最好修改m()以返回一个Optional,如果y无效则返回空,但我假设您要检查调用方。

答案 3 :(得分:-1)

为什么不

switch (x) {
  case 1:
    y = "foo";
    m(y);
    break;
  case 2:
    y = "bar";
    m(y);
    break;
}