我需要在運行時替換比較運算子,其中兩個數字將比較 GreaterThanOrEquals、LessThanOrEquals、Equals 等,但理想情況下我不會復制我的整數、雙精度、長整數、短整數、浮點數和位元組的代碼。我的部分要求是盡可能地將操作保持在 lambdas 中以提高性能。
注意:兩個值將始終是相同的型別。我無意進行混合型別的比較。
這是我的代碼的粗略。我試圖用 Java.lang.Number 引數化最后一個靜態方法,但 >= 不適用于 Number:
public class Expression {
public Param p1;
public Operator o;
public Param p2;
public Object eval() {
return o.eval(p1.getValue(),p2.getValue());
}
}
public interface Operator<T>{
Object eval(T p1,T p2);
}
public interface GreaterOrEqual extends Operator<Number>{
static Operator<Integer> Integers() {
return (v1, v2) -> v1 >= v2;
}
static Operator<Double> Doubles() {
return (v1, v2) -> v1 >= v2;
}
static Operator<Long> Longs() {
return (v1, v2) -> v1 >= v2;
}
static Operator<Number> generic() {
// this one won't compile as ">= can't be applied to Java.lang.Number"
return (v1, v2) -> v1 >= v2;
}
}
編輯:此代碼重復也意味著我的 GUI 代碼將需要使用if (Param.value instanceof Integer) Expression.setOperator(GreaterOrEqual.Integers);更多的代碼重復。
uj5u.com熱心網友回復:
首先你必須明白,你沒有從寫作中得到任何好處Operator<Integer>。Java 使用自動裝箱來轉換int為Integer包裝器物件。然后在您的代碼 ( (v1, v2) -> v1 >= v2) 中,Integer物件被轉換回int.
更通用的解決方案將使用該Comparable介面。 Number不實作介面,但所有重要的 Number 實作都Double支持它。
Operator<Comparable<?>> gt = (v1, v2) -> v1.compareTo(v2) > 0;
Operator<Comparable<?>> ge = (v1, v2) -> v1.compareTo(v2) >= 0;
Operator<Comparable<?>> ge = (v1, v2) -> v1.compareTo(v2) = 0;
Operator<Comparable<?>> le = (v1, v2) -> v1.compareTo(v2) <= 0;
Operator<Comparable<?>> lt = (v1, v2) -> v1.compareTo(v2) < 0;
compareTo 如果引數較小,則回傳 1,如果大小相同則回傳 0,其中 -1 較大。
uj5u.com熱心網友回復:
可比介面的使用
public static <T extends Comparable<? super T>> int compare(T x, T y) {
return x != null ? x.compareTo(y) : -y.compareTo(x);
}
可能的結果
-1,當x小于y0,當x等于y1,當x大于y
可能的用法
compare(x, y) < 0-x小于y
compare(x, y) <= 0-x小于或等于y
compare(x, y) == 0-x等于y
compare(x, y) >= 0-x大于或等于y
compare(x, y) > 0-x大于y
如果有錯誤或問題,請通知我!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370272.html
上一篇:在另一個trait的trait實作中使用constgeneric會導致“不受約束的const引數”錯誤
下一篇:使用PHP創建自動填充表單
