Вы можете использовать это повторно, если используете функциональное программирование.Существует множество библиотек, в которых написано много материала для вас.В этом примере я просто использовал Guava (http://code.google.com/p/guava-libraries/),, но библиотеки, такие как Functional Java (http://functionaljava.org/), будут работать так же хорошо.
). Одним из основных преимуществ функционального программирования является возможность абстрагировать алгоритмтак что вы можете использовать этот алгоритм везде, где вам нужно. Для вашего случая ваш алгоритм по сути такой:
- Для каждого элемента в списке
- Выполните операцию x для этого элемента
- Возврат нового списка
Хитрость заключается в том, чтобы передать новую операцию вместо «x» в зависимости от того, что вы хотите сделать. В мире функционального программирования мысоздайте объект с именем «функтор», который на самом деле является просто способом инкапсуляции функции в объекте (если бы в Java были замыкания, это было бы еще проще, но это то, что мы имеем).
В любом случаеВот немного кода, который будет делать то, что вы хотите:
Класс: обратный
import com.google.common.base.Function;
public class Inverse implements Function
{
@Override
public Double apply(Double arg0)
{
return Math.pow(arg0, -1);
}
}
Класс: логарифм
import com.google.common.base.Function;
public class Logarithm implements Function
{
@Override
public Double apply(Double arg0)
{
return Math.log(arg0);
}
}
Класс: драйвер
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import com.google.common.collect.Collections2;
public class Driver
{
@Test
public void testInverse()
{
List initialValues = Arrays.asList(new Double[] {1.0, 2.0, 3.0});
List logValues = new ArrayList(Collections2.transform(initialValues, new Inverse()));
assertEquals(3, logValues.size());
assertEquals(Double.valueOf(1.0), logValues.get(0), 0.01);
assertEquals(Double.valueOf(0.5), logValues.get(1), 0.01);
assertEquals(Double.valueOf(0.333), logValues.get(2), 0.01);
}
}
Водитель класs просто содержит один контрольный пример, но он иллюстрирует использование Функторов, определенных выше.Вы заметите использование метода Collections2.transform в методе testInverse выше.Документацию по этому методу можно найти здесь:
http://guava -libraries.googlecode.com / svn / trunk / javadoc / com / google / common / collect / Collections2.html # transform% 28java.util.Collection,% 20com.google.common.base.Function% 29
По сути, этот метод абстрагируется от алгоритма перехода по списку и применения некоторой функции к каждому элементуэтот список - все, что вам нужно сделать, это применить функцию для выполнения.Итак, в этом случае я передаю этому методу список двойников и функтор (Inverse).Это возвращает мне новый список, который содержит инверсию каждого значения в начальном списке.Если вы предпочитаете делать записи каждого значения, передайте другой функтор в метод преобразования.
Этот тип программирования имеет небольшую кривую обучения, но он может быть совершенно потрясающим для типаповторное использование кода вы хотите сделать.А используя существующие библиотеки (например, Guava), вы можете сделать свой код еще проще для написания.Обратите внимание, что код, который я написал, на самом деле немного проще, чем тот, который вы написали, потому что мне не приходится иметь дело со списками / массивами при выполнении моих математических функций - я просто выполняю его на одном элементе;функция преобразования заботится о применении этой функции ко всему списку.