import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; public class CustomSet<T> { private Set<T> set; public CustomSet() { this(Collections.EMPTY_LIST); } public CustomSet(Collection<T> data) { set = new HashSet<>(data.size()); this.set.addAll(data); } public boolean isEmpty() { return set.isEmpty(); } public boolean contains(T element) { return set.contains(element); } public boolean isSubset(CustomSet<T> anotherSet) { return set.containsAll(anotherSet.set); } public boolean isDisjoint(CustomSet<T> anotherSet) { if (set.isEmpty() || anotherSet.set.isEmpty()) { return true; } return set.stream() .filter(elem -> anotherSet.set.contains(elem)) .count() == 0; } public boolean equals(CustomSet<T> anotherSet) { return set.equals(anotherSet.set); } public boolean add(T element) { return set.add(element); } public CustomSet<T> getIntersection(CustomSet<T> anotherSet) { return new CustomSet<>( set.stream() .filter(anotherSet.set::contains) .collect(Collectors.toList()) ); } public CustomSet<T> getUnion(CustomSet<T> anotherSet) { final Set<T> union = new HashSet<>(set); union.addAll(anotherSet.set); return new CustomSet<>(union); } public CustomSet<T> getDifference(CustomSet<T> anotherSet) { final Predicate<T> predicate = anotherSet::contains; return new CustomSet<>( set.stream() .filter(predicate.negate()) .collect(Collectors.toList()) ); } }