我怎样才能避免在java中做很多if?

时间:2016-11-20 15:32:33

标签: java c++

在c ++中,我会使用int / pointer的映射来实现这样的函数:

std::map = {
{Code::Value1, Handler::value1Handler},
{Code::Value2, Handler::value2Handler},
};

为了避免做很多像是

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

但我没有找到在Java中这样做的好方法,是否可能?

4 个答案:

答案 0 :(得分:4)

我意识到,如果返回类型很重要,您希望将关键字T与相应的操作Consumer<T>(或Function<K, V>)关联起来。

不幸的是,我们没有地图文字,所以简而言之,可以使用init块生成HashMap子类:

Map<T, Consumer<T>> map = new HashMap<T, Consumer<T>>() {{
    put(k1, v -> {/* value handler 1 */});
    put(k2, v -> {/* value handler 2 */});
}};

作为地图值,您可以使用键传递要执行的操作。例如,

v -> System.out.println(v)

如果此类操作是单个操作,则可以使用方法引用替换它:

System.out::println

(我理解valueXHandler返回一个地图值,他们不仅仅是消费者。因此,Function<K, V>是我们的方式)

通常,我会写一个mapper,它将一个键转换为一个值并返回该值:

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

它的用法很简单:

map.put(k1, mapToValue(k1, k1 -> v1));

答案 1 :(得分:3)

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

对于非常小的程序而言,这可能不是正确的解决方案,但在处理实际项目时,这是一种非常好的做法(并且在诸如State,Strategy等设计模式中实现)。

答案 2 :(得分:0)

您可以使用开关执行此操作:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

public class SwitchDemo {
    public static void main(String[] args) {

        int month = 8;
        String monthString;
        switch (month) {
            case 1:  monthString = "January";
                     break;
            case 2:  monthString = "February";
                     break;
            case 3:  monthString = "March";
                     break;
            case 4:  monthString = "April";
                     break;
            case 5:  monthString = "May";
                     break;
            case 6:  monthString = "June";
                     break;
            case 7:  monthString = "July";
                     break;
            case 8:  monthString = "August";
                     break;
            case 9:  monthString = "September";
                     break;
            case 10: monthString = "October";
                     break;
            case 11: monthString = "November";
                     break;
            case 12: monthString = "December";
                     break;
            default: monthString = "Invalid month";
                     break;
        }
        System.out.println(monthString);
    }
}

答案 3 :(得分:0)

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

  1. 使用哈希映射来利用一对存储。

  2. 使用switch case会有助于避免在if-else条件下进行多次检查。

  3. 你可以很好地利用C ++的OOP概念并使用多态(使用多个子节点或多个接口)。