Как проверить общие условия? - PullRequest
1 голос
/ 08 октября 2019

Я перевел код с Matlab (ориентация массива) на Java (ООП). Проблема возникла, когда мне пришлось перевести эту функцию Matlab:

min_omegaF_restricted=min(omegaF(p>cost));

Здесь omegaF - это вектор с чистой стоимостью каждой фирмы. p вектор цен для каждой фирмы. cost вектор затрат для каждой фирмы. Выше рассчитывается минимальная чистая стоимость выживших фирм с требуемой ценой выше, чем их стоимость. В java можно перевести на:

double min_omegaF_restricted=Double.POSITIVE_INFINITY;
for(int f=0; f<F; f++){
    Firm fo=firms.get(f);
    if(fo.p>fo.cost)
        min_omegaF_restricted=Math.min(min_omegaF_restricted, fo.omegaF);
}

Есть ли возможность обобщить этот вид предложения до какого-либо условия (fo.p>fo.cost)?

1 Ответ

1 голос
/ 08 октября 2019

Да. Функциональные интерфейсы и лямбды в Java 8 делают это простым и легким для глаз. Создайте Predicate , который проверяет объект и возвращает логическое значение.

Predicate<Firm> predicate = firm -> firm.p > firm.cost;

Затем вы можете использовать предикат в цикле следующим образом:

double min_omegaF_restricted=Double.POSITIVE_INFINITY;
for(int f=0; f<F; f++){
    Firm fo=firms.get(f);
    if(predicate.test(fo))
        min_omegaF_restricted=Math.min(min_omegaF_restricted, fo.omegaF);
}

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

double min_omegaF_restricted = firms.stream()
    .filter(predicate)
    .mapToDouble(f -> f.omegaF)
    .min()
    .orElse(Double.POSITIVE_INFINITY);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...