我如何避免做大量的if';什么是java? 在C++中,我将使用int /指针的映射来实现如下功能: std::map = { {Code::Value1, Handler::value1Handler}, {Code::Value2, Handler::value2Handler}, };

我如何避免做大量的if';什么是java? 在C++中,我将使用int /指针的映射来实现如下功能: std::map = { {Code::Value1, Handler::value1Handler}, {Code::Value2, Handler::value2Handler}, };,java,c++,Java,C++,为了避免做很多类似的事情 if (value == Code::Value1) value1Handler(); if (value == Code::Value2) value2Handler(); if (value == Code::Value3) value3Handler(); 但是我没有找到一个在Java中实现这一点的好方法,有可能吗 您可以使用开关执行此操作: 一个好的(大多数情况下是正确的)解决方案是使用多态性。使用一个抽象类(或一个接口),该抽象类有许多子类,这些

为了避免做很多类似的事情

if (value == Code::Value1)
  value1Handler();
if (value == Code::Value2)
  value2Handler();
if (value == Code::Value3)
  value3Handler();

但是我没有找到一个在Java中实现这一点的好方法,有可能吗

您可以使用开关执行此操作:

一个好的(大多数情况下是正确的)解决方案是使用多态性。使用一个抽象类(或一个接口),该抽象类有许多子类,这些子类具有所需操作(相关函数)的不同实现。 然后,使用工厂函数根据值返回(或生成)适当的对象类型,并运行其操作函数


对于非常小的程序来说,这可能不是正确的解决方案,但在处理实际项目时,这是一个非常好的实践(并且在设计模式中实现,例如状态、策略和其他)

正如我所意识到的,您希望将键
T
与相应的操作
消费者
(或
函数
,如果返回类型重要)

不幸的是,我们没有映射文字,因此简而言之,可以使用init块生成
HashMap
子类:

Map<T, Consumer<T>> map = new HashMap<T, Consumer<T>>() {{
    put(k1, v -> {/* value handler 1 */});
    put(k2, v -> {/* value handler 2 */});
}};
如果此类操作是单个操作,则可以用方法引用替换:

System.out::println

(在这里我理解到,
valueXHandler
s返回一个映射值,他们不仅仅是消费者。因此,
Function
是我们的方式)

通常,我会编写一个映射器,将键转换为值并返回该值:

public <K, V> V mapToValue(K key, Function<K, V> function) {
    return function.apply(key);
}

您可以采用3种方法,即:-

  • 使用哈希映射利用成对类型的存储

  • 使用开关盒将有助于避免在if-else条件下多次签入

  • <> >您可以很好地利用C++的OOP概念,并且也使用多态性(使用多个子或多个接口)。


    开关箱?..@FastSnail我不喜欢开关箱。。。我不认为这很干净如果你想基于输入执行某些方法,那么我认为命令模式可能就是你所想的。Java有映射:@DimitriDanilov你可以在其中放置对象并调用这些对象上的方法SOP评论说他不喜欢使用
    switch
    语句。一个糟糕的样板示例,带有
    String
    /
    int
    字段和一个静态方法的枚举应该替换我否决的混乱(我没有否决),不是因为回答了
    开关,而是因为您复制并粘贴了教程中的示例,而不是给出一个简化示例或您自己的更相关示例。看来你看到了《快速蜗牛》的帖子,并采取了行动,而没有真正考虑你的答案。对不起,伙计。如果你修正了你的答案,我将非常乐意收回否决票。在这种情况下,字符串数组将比
    开关
    语句更有效。Guava和其他库有方便的地图生成器,这将使这个示例更简洁。你能解释一下吗?对于1,显示一些将lambda放入哈希映射的代码?OP似乎不喜欢
    switch
    语句。对于3,我完全不明白你没有代码是什么意思。
    System.out::println
    
    public <K, V> V mapToValue(K key, Function<K, V> function) {
        return function.apply(key);
    }
    
    map.put(k1, mapToValue(k1, k1 -> v1));