public static <U, I, O> SimplePreferenceData<U, I> load(Stream<Tuple4<U, I, Double, O>> tuples,
Function4<U, I, Double, O, ? extends IdPref<I>> uPrefFun,
Function4<U, I, Double, O, ? extends IdPref<U>> iPrefFun) {
AtomicInteger numPreferences = new AtomicInteger(0);
Map<U, List<IdPref<I>>> userMap = new HashMap<>();
Map<I, List<IdPref<U>>> itemMap = new HashMap<>();
tuples.forEach(t -> {
numPreferences.incrementAndGet();
userMap.computeIfAbsent(t.v1, v1 -> new ArrayList<>()).add(uPrefFun.apply(t));
itemMap.computeIfAbsent(t.v2, v2 -> new ArrayList<>()).add(iPrefFun.apply(t));
});
return new SimplePreferenceData<>(userMap, itemMap, numPreferences.intValue());
}
}