com.jparams.store.index.reducer.MinReducer Maven / Gradle / Ivy
package com.jparams.store.index.reducer;
import java.util.List;
import java.util.function.Function;
import com.jparams.store.index.Element;
/**
* Reduces all elements for a key retaining the min value
*
* @param key type
* @param value type
*/
public class MinReducer> implements Reducer
{
private final boolean nullGreater;
private final Function valueProvider;
public MinReducer(final Function valueProvider, final boolean nullGreater)
{
this.valueProvider = valueProvider;
this.nullGreater = nullGreater;
}
@Override
public void reduce(final K key, final List> elements)
{
elements.stream().reduce(this::reduce);
}
private Element reduce(final Element element1, final Element element2)
{
final C comparable1 = valueProvider.apply(element1.get());
final C comparable2 = valueProvider.apply(element2.get());
if (compare(comparable1, comparable2) < 0)
{
element2.remove();
return element1;
}
element1.remove();
return element2;
}
private int compare(final C value1, final C value2)
{
if (value1 == value2)
{
return 0;
}
if (value1 == null)
{
return nullGreater ? 1 : -1;
}
if (value2 == null)
{
return nullGreater ? -1 : 1;
}
return value1.compareTo(value2);
}
}