как мне превратить строковый математический оператор i.e & ldquo; + & rdquo; в математический оператор i.e + [duplicate]

В дополнение к @assylias answer вы также можете использовать новый поток api, если вы используете Java 8:

List l = Arrays.asList(4, 5, 6);

static boolean condition(Integer i) {
    return i == 5;
}

static Predicate predicate = YourClassName::condition;

l.stream()
    .filter(predicate.negate())
    .forEach(System.out::println);

Если вы инвертируете условие, решение становится еще более кратким, поскольку вам не нужно negate() предикат, что позволяет использовать только ссылку на метод:

List l = Arrays.asList(4, 5, 6);

static boolean condition(Integer i) {
    return i != 5;    // <-- condition has been negated
}

l.stream()
    .filter(YourClassName::condition)
    .forEach(System.out::println);

Один из красотой этого является то, что поток лениво оценивается, т. е. операция filter() фактически не оценивается до тех пор, пока она не будет использована терминальной операцией, такой как forEach(). Подробнее об этом можно найти в учебнике для Oracle .

59
задан Gary 5 March 2013 в 01:58
поделиться

5 ответов

Вы не можете перегружать операторов в JavaScript. Вы можете использовать функции, чтобы помочь

var plus = function(a, b) {
    return a + b;
};

var smaller = function(a, b) { 
    return a < b;
};

var operator = plus;
var total = operator(a, b);
operator = smaller;
if(operator(var1, var2)){ /*do something*/ }
2
ответ дан cellcortex 18 August 2018 в 05:45
поделиться

Я считаю, что вам нужен оператор переменной. вот один, созданный как объект. вы можете изменить текущую операцию, изменив:

[yourObjectName].operation = "<" //changes operation to less than


function VarOperator(op) { //you object containing your operator
    this.operation = op;

    this.evaluate = function evaluate(param1, param2) {
        switch(this.operation) {
            case "+":
                return param1 + param2;
            case "-":
                return param1 - param2;
            case "*":
                return param1 * param2;
            case "/":
                return param1 / param2;
            case "<":
                return param1 < param2;
            case ">":
                return param1 > param2;
        }
    }
}

//sample usage:
var vo = new VarOperator("+"); //initial operation: addition
vo.evaluate(21,5); // returns 26
vo.operation = "-" // new operation: subtraction
vo.evaluate(21,5); //returns 16
vo.operation = ">" //new operation: ">"
vo.evaluate(21,5); //returns true
5
ответ дан danniel 18 August 2018 в 05:45
поделиться

мы можем реализовать это с помощью eval, так как мы используем его для проверки оператора.

var number1 = 30;
var number2 = 40;
var operator = "===";

function evaluate(param1, param2, operator) {
     return eval(param1 + operator + param2);
}

if(evaluate(number1, number2, operator)) {
}

таким образом мы можем использовать динамическую оценку оператора.

2
ответ дан Manu 18 August 2018 в 05:45
поделиться

Вы можете использовать функцию eval(), но это не очень хорошая идея. Я думаю, что лучший способ - написать функции для ваших операторов следующим образом:

var addition = function(first, second) {
   return first+second;
};

var subtraction = function(first, second) {
   return first-second;
};

var operator = addition;

alert(operator(12, 13));

var operator = subtraction;

alert(operator(12, 13));
6
ответ дан Ry- 18 August 2018 в 05:45
поделиться

Из другого ответа, который я недавно опубликовал, это в V8, и я думаю, что JavaScriptCore, но не Firefox, и это не спецификация. Поскольку вы можете захватить операцию и компараторы, вы можете реализовать собственную перегрузку оператора в большинстве ситуаций с небольшим количеством работы.

var actions = [];
var overload = {
  valueOf: function(){
    var caller = arguments.callee.caller;
    actions.push({
      operation: caller.name,
      left: caller.arguments[0] === this ? "unknown" : this,
      right: caller.arguments[0]
    });
    return Object.prototype.toString.call(this);
  }
};
overload.toString = overload.valueOf;
overload == 10;
overload === 10;
overload * 10;
10 / overload;
overload in window;
-overload;
+overload;
overload < 5;
overload > 5;
[][overload];
overload == overload;
console.log(actions);

Выход:

[ { operation: 'EQUALS',
    left: overload,
    right: 10 },
  { operation: 'MUL',
    left: overload,
    right: 10 },
  { operation: 'DIV',
    left: 'unknown',
    right: overload },
  { operation: 'IN',
    left: overload,
    right: DOMWindow },
  { operation: 'UNARY_MINUS',
    left: overload,
    right: undefined },
  { operation: 'TO_NUMBER',
    left: overload,
    right: undefined },
  { operation: 'COMPARE',
    left: overload,
    right: 5 },
  { operation: 'COMPARE',
    left: 'unknown',
    right: overload },
  { operation: 'ToString',
    left: 'unknown',
    right: overload } ]

На этом этапе вы имеют все входы и операцию, так что оставшаяся часть является результатом операции. Получатель операции получит примитивное значение, будь то строка или номер, и вы не можете этого предотвратить. Если это не произвольный приемник, скажем, экземпляр класса, в котором вы перегружены оператором, вы можете обрабатывать различные ловушки get / set для перехвата входящего значения / предотвращения перезаписи. Вы можете хранить операнды и операции в некотором центральном поиске и использовать простой метод для отслеживания примитивного значения обратно к операции, которая его создала, а затем создать любую логику, которую вы хотите выполнить свою собственную операцию. Другой метод, который позволил бы произвольным приемникам, которые впоследствии могли быть перестроены в сложные формы, заключался бы в кодировании данных в примитивное значение, чтобы его можно было отменить обратно в ваш сложный класс. Например, значение RGB из 3 различных 8-битных целых чисел (255,255,255) может быть преобразовано в одно число на конце завершения, а конец приемника может тривиально преобразовать его обратно в его сложные компоненты. Или для более сложных данных вы можете даже вернуть сериализованную строку JSON.

Имея доступ к протоколам Harmony Proxy (Firefox6 +, Nodejs с флагом), этот процесс становится намного проще, так как вы можете создавать прокси-серверы в основном для всего и интроспекция всего процесса из конца в конец и делать все, что вы хотите. Экземпляры операнда ваших данных / класса, значениеOf / toString / getters любого возможного значения, к которому может обращаться внутренний движок, любой объект-получатель, у вас есть предварительная осведомленность и даже захват произвольных приемников в случае with(trappingProxy){ "all variable lookup, creation, and setting in here invokes traps on our proxy"; }

3
ответ дан user 18 August 2018 в 05:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: