Что является Java-эквивалентом накопления C ++ или внедрения Groovy? - PullRequest
4 голосов
/ 14 декабря 2011

По сути, я хотел бы сделать следующее в виде одной строки:

        int sum = initialValue;
        for (int n : collectionOfInts) {
            sum += n;
        }
        return sum;

Я вижу, что есть http://functionaljava.org/examples/1.5/#Array.foldLeft,, но я бы предпочел не копировать коллекцию.

Ответы [ 3 ]

3 голосов
/ 14 декабря 2011

Я вижу, что есть http://functionaljava.org/examples/1.5/#Array.foldLeft,, но я бы предпочел не копировать коллекцию.

Если вы используете foldLeft из IterableW вместо массива вам не нужно ничего копировать.

0 голосов
/ 19 января 2012

Просто для удовольствия - вот как это сделать без внешней библиотеки:

return fold(collectionOfInts, 0, ADD);

О, а вот и все остальное:)

static <X, Y> X fold(final Iterable<? extends Y> gen, final X initial, final Function2<? super X, ? super Y, ? extends X> function) {
  final Iterator<? extends Y> it = gen.iterator();
  if (!it.hasNext()) {
    return initial;
  }
  X acc = initial;
  while (it.hasNext()) {
    acc = function.apply(acc, it.next());
  }
  return acc;
}

static final Function2<Integer, Integer, Integer> ADD = new Function2<Integer, Integer, Integer>() {
  @Override
  public Integer apply(Integer a, Integer b) {
    return a + b;
  }
};

interface Function2<A, B, C> {
  C apply(A a, B b);
}
0 голосов
/ 14 декабря 2011

Извините, он все еще не существует в Java 7. Вам придется ждать Java 8, где должны быть реализованы замыкания.

Тем временем вы можете использовать FunctionalJava, Guava или JVM-совместимый язык с поддержкой замыкания, такой как Groovy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...