@@ -0,0 +1,1659 @@
+package uia.utils.cube;%0A%0Aimport java.util.List;%0Aimport java.util.Map;%0Aimport java.util.TreeMap;%0Aimport java.util.function.Function;%0Aimport java.util.stream.Collectors;%0Aimport java.util.stream.Stream;%0A%0Apublic class ListCube%3CT%3E implements Cube%3CT%3E %7B%0A%0A    private final List%3CData%3CT%3E%3E data;%0A%0A    ListCube(List%3CData%3CT%3E%3E data) %7B%0A        this.data = data;%0A    %7D%0A%0A    @Override%0A    public T single() %7B%0A        return this.data.size() %3E 0 ? this.data.get(0).value : null;%0A    %7D%0A%0A    @Override%0A    public Stream%3CT%3E values() %7B%0A        return this.data.stream().map(t -%3E t.value);%0A    %7D%0A%0A    @Override%0A    public Map%3CString, List%3CT%3E%3E valuesMapping(final String tagName) %7B%0A        return this.data.stream().collect(%0A                Collectors.groupingBy(%0A                        d -%3E d.getTag(tagName),%0A                        Collectors.mapping(v -%3E v.value, Collectors.toList())));%0A    %7D%0A%0A    @Override%0A    public Map%3CString, T%3E singleMapping(final String tagName) %7B%0A        TreeMap%3CString, T%3E result = new TreeMap%3CString, T%3E();%0A        valuesMapping(tagName).forEach((k, v) -%3E result.put(k, v.get(0)));%0A        return result;%0A    %7D%0A%0A    @Override%0A    public Cube%3CT%3E select(String tagName, String tagValue) %7B%0A        return new StreamCube%3CT%3E(this.data.stream().filter(d -%3E tagValue.equals(d.getTag(tagName))));%0A    %7D%0A%0A    @Override%0A    public Cube%3CT%3E selectNot(String tagName, String tagValue) %7B%0A        return new StreamCube%3CT%3E(this.data.stream().filter(d -%3E !tagValue.equals(d.getTag(tagName))));%0A    %7D%0A%0A    @Override%0A    public Cube%3CT%3E select(Function%3CData%3CT%3E, Boolean%3E function) %7B%0A        return new StreamCube%3CT%3E(this.data.stream().filter(function::apply));%0A    %7D%0A%7D%0A

add ListCube