Есть ли способ сделать этот типизированный метод generi c? - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь написать метод, который принимает любую коллекцию любого типа, две функции и два целочисленных значения, которые представляют определенный предел.

Для лучшего понимания я покажу пример метода, который я хотел бы построить generi c.

private void buildSums() {
    double sum = 0;
    for (YearlyLineValuesEntity y_l_v_E : yearlyList) {
        if (y_l_v_E.getDb() >= 20001 && y_l_v_E.getDb() <= 20155) {
            sum += y_l_v_E.getAmount();
        }
    }
}

Возвращаемое значение в примере метода в этом случае не имеет значения. Это служит только для базового c понимания моей цели.

Это моя попытка:

Числа в приведенном выше утверждении if представлены параметрами «от» и «до» в следующем методе, который я пробовал. getDb () должен исходить из параметра "propertyDb", а getAmount () должен исходить из "propertyAmount" -параматора.

    <T> List <Double> sumUpGroup(Collection<? extends T> entityList, Function<? super T, Integer> propertyDb, Function<?
        super T, Double> propertyAmount, int from, int to) {
    Double sum = null;
    List<Double> list = null;
    for (int i = 0; i < entityList.size(); i++) {
        EntityList x = entityList.get(i); //generic type
        if (x.getDB() >= from && x.getDB() <= to) { //propertyDb here
            sum += x.getAmount(); //propertyAmount here
        }
    }
    list.add(sum);
    return list;
}

Я не знаю, как действовать дальше в коде с двумя функциями, которые прийти в качестве параметров в методе. Нужен ли другой метод, чтобы позаботиться об этом?

У кого-нибудь из вас есть идеи? Спасибо

1 Ответ

2 голосов
/ 25 февраля 2020

Будет работать что-то вроде следующего (для ясности я удалил список)

<T> double sumUpGroup(Collection<? extends T> entityList, 
    Function<? super T, Integer> dbAccessor, 
    Function<? super T, Double> amountAccessor, 
    int from, int to) {

    double sum = 0;
    for (T entity : entityList) {
        int value = dbAccessor.apply(entity);
        if (value >= from && value <= to) {
            sum += amountAccessor.apply(entity);
        }
    }

    return sum;
}

Затем вы вызываете метод следующим образом, с правильными именами методов, заданными, конечно,

sumUpGroup(myEntities, Entity::getDbValue, Entity::getAmount, 0, 100);
...