【问题标题】:Super class of String and Integer in Java 8Java 8 中 String 和 Integer 的超类
【发布时间】:2017-04-18 15:18:04
【问题描述】:

我正在写一个简单的 Predicate 函数如下:

public static Predicate<String> stringPredicate(String op, String compVal) {
    if (op.equals("=")){
        return p -> p.compareTo(compVal) == 0;
    }
    else if (op.equals("<")){
        return p -> p.compareTo(compVal) == -1;
    }
    else if (op.equals("<=")){
        return p -> p.compareTo(compVal) == 0 || p.compareTo(compVal) == -1;
    }
    else if (op.equals(">")){
        return p -> p.compareTo(compVal) == 1;
    }
    else if (op.equals(">=")){
        return p -> p.compareTo(compVal) == 1 || p.compareTo(compVal) == 0;
    }
    return p -> -1 == 0; //return false 
}

我希望这个函数同时适用于整数、浮点数和字符串。因此,与其编写 2 个相同的谓词函数,一个用于字符串,一个用于 Integer+Float,我想编写一个,因为 compareTo() 方法适用于所有 3 个。我想我可以通过更换来做到这一点 Predicate&lt;String&gt;Predicate&lt;Super class of Integer/Float/String&gt;。我试过Object,但没用。那么,我应该放什么而不是&lt;String&gt; 才能以我想要的方式使用该功能?

【问题讨论】:

  • 我不明白你的意思?我有 if-else,如果有,对吗?我错过了什么吗?
  • @SpiderRico equals==.
  • 啊,我明白了,是的。但这在正确性方面不会有太大变化,对吧?
  • @SpiderRico 是的,它会:stackoverflow.com/questions/513832/…
  • @SpiderRico 取决于您所指的“正确性”。

标签: java apache-spark lambda


【解决方案1】:

IntegerString 除了Object 之外没有共同的“超类”,因为它没有compareTo,所以对你没用。

但是两者之间有一个共同的接口——Comparable&lt;T&gt;,它提供了compareTo方法。

public static <T extends Comparable<T>> Predicate<T> predicate(String op, T compVal) {
    switch (op) {
        case "=": return p -> p.compareTo(compVal) == 0;
        case "<": return p -> p.compareTo(compVal) < 0;
        case "<=": return p -> p.compareTo(compVal) <= 0;
        case ">": return p -> p.compareTo(compVal) > 0;
        case ">=": return p -> p.compareTo(compVal) >= 0;
        default: return p -> false;
    }
}

(从 Java 7 开始,您可以使用 switch on strings,因此在这里使用 if/else 链是没有意义的。但在您的情况下是 an enum for op may even be more suitable。)

【讨论】:

  • 谢谢。这看起来正是我需要的。
  • 考虑基于Map&lt;String,BiFunction&lt;T,T,Boolean&gt;curryingfunctionMap.put("&gt;", (a,b) -&gt; x.compareTo(y) &gt; 0) 等然后return p -&gt; functionMap.get(op).apply(p,compVal)。或者一个枚举而不是地图。
  • @slim 这只是将switch 移动到Map,您仍然需要复制相同数量的代码。我不知道这会如何改善任何事情:)
猜你喜欢
  • 2017-01-28
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2020-06-29
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
相关资源
最近更新 更多