У меня есть обучающая java 8 самая сложная вещь, с которой мне приходится сталкиваться: Parallel reduction.
вот код с примера пользователя @Stuart Marks, с которым я изучаю.Java8 поток параллельный уменьшить аккумулятор BiFunction
class ImmutableAverager
{
private final int total;
private final int count;
public ImmutableAverager(){this.total = 0;this.count = 0;}
public ImmutableAverager(int total, int count)
{
this.total = total;
this.count = count;
}
public double average(){return count > 0 ? ((double) total)/count : 0;}
public ImmutableAverager accept(final int i)
{
return new ImmutableAverager(total + i, count + 1);
}
public ImmutableAverager combine(final ImmutableAverager other)
{
return new ImmutableAverager(total + other.total, count + other.count);
}
вызов
public static void main(String[] args)
{
System.out.println(Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
.parallel()
.reduce(new ImmutableAverager(),
ImmutableAverager::accept,
ImmutableAverager::combine)
.average());
}
это производят правильные результаты, но позже я проверил подпись метода снижения
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
я понял бы ясно, если код будет что-то вроде
.reduce(new ImmutableAverager(),(a,b)->a.accept(b),(a,b)->a.combine(b))
я не понимаю, как
ImmutableAverager::accept
может конвертировать в BiFunction
мое понимание ..
это
ImmutableAverager::accept
это превратить его в нечто вроде
(ImmutableAverage a)->a.accept();//but this is a function with 1 parameter not with 2 parameters.
и
ImmutableAverager::merge
может конвертировать в BinaryOperator
мой друг @Stuart Маркс говорит
методы совпадают с аргументами функции, чтобы уменьшить таким образом мы можем использовать ссылки на метод.
извините, если вопрос прост, но любая помощь очень ценят ..
наилучшими пожеланиями из Венесуэлы
Hi. К счастью, я оказался в сети в тот момент, когда вы задали этот вопрос. :-) –