Как использовать пользовательский функциональный интерфейс с методом, принимающим 2 аргумента в ArrayList? - PullRequest
0 голосов
/ 05 ноября 2019
@FunctionalInterface
public interface Test{

     int sum(int a, int b);

}

Как мы можем использовать этот метод суммирования для добавления всех элементов ArrayList? Примечание: также хотите использовать stream.

Некоторые пользователи предположили, что метод sum уже доступен для этой цели;Моя цель состояла не в том, чтобы суммировать элементы списка, , чтобы понять, как мы будем использовать пользовательский функциональный интерфейс в списке.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2019

Предполагая, что метод sum вашего функционального интерфейса возвращает целое число, вы можете использовать метод Reduce from stream. Итак, ваш функциональный интерфейс будет выглядеть так:

@FunctionalInterface
public interface Test{

    int sum(int a, int b);

}

А вот пример метода Reduce:

yourArraysList.stream().reduce(0, testImpl::sum);

Где testImpl - это экземпляр реализации функционального интерфейса Test.

Существует также метод sum () для потока, который имеет дело с суммой элементов потока.

Ссылка здесь

1 голос
/ 05 ноября 2019

Предполагая, что ваш функциональный интерфейс выглядит следующим образом:

@FunctionalInterface
public interface Test {
    int sum(int a, int b);
}

Вы можете использовать лямбда-функцию для реализации функционального интерфейса (метод суммы) и использовать метод Reduce из потока (в идеале метод суммы ненеобходимо, если вы хотите использовать поток, поскольку лямбда-функцию можно использовать непосредственно в методе Reduce):

Test test = (a, b) -> a+b;
someArrayList.stream().reduce(0, test::sum);
0 голосов
/ 05 ноября 2019

Прежде чем что-либо реализовать против своего interface Test ума, если и как вы хотите обработать результат метода. В этом случае не будет возвращено никакого результата, потому что вы объявили метод как void.

Вы можете начать с метода, который фактически возвращает результат и принимает желаемый аргумент:

@FunctionalInterface
public interface Test {

    /**
     * <p>
     * Sums up all the values provided in the given list.
     * </p>
     *
     * @param list the list of numbers to be summed up
     * @return the sum of all the values
     */
    default int sum(List<Integer> list) {
        return list.stream()
                .collect(Collectors.summingInt(Integer::intValue))
    }
}

Затем реализуйте метод в некотором классе, который implements Test, или используйте реализацию default.

Обратите внимание, что результат суммирования нескольких int s или Integer s может стать больше чем Integer.MAX_VALUE
и
, этот interface не будет компилироваться, пока не существует метода без default реализация .

...