Ramesh K :
I currently have a java program that uses nested for loops to compute the union and intersection of a list of set of integers. How to do this using java parallel streams ? The code i have currently is as follows
for(Set<Integer> x : listA) {
for (Set<Integer> y : listB) {
Set u = Sets.union(x,y); // Uses Guava library
Set i = Sets.intersection(x,y);
}
}
I would like to make this fast as listA and listB are large.
Darshan Mehta :
You don't need streams for union, however, you can use it for intersection, e.g.:
Set<Integer> setA = new HashSet<>(Arrays.asList(1,2,3));
Set<Integer> setB = new HashSet<>(Arrays.asList(2,3,4));
Set<Integer> union = new HashSet<>();
union.addAll(setA);
union.addAll(setB);
Set<Integer> intersection = setA.parallelStream()
.filter(setB::contains)
.collect(Collectors.toSet());
System.out.println("Union : " + union);
System.out.println("Intersection : " +intersection);
Update
The above code finds intersection and union using Java's native libraries and streams
. However, if you have a list of sets then you can wrap the above code in function and call it from stream
that iterates two lists, e.g.:
private static void unionAndIntersection(Set<Integer> setA, Set<Integer> setB) {
Set<Integer> union = new HashSet<>();
union.addAll(setA);
union.addAll(setB);
Set<Integer> intersection = setA.parallelStream()
.filter(setB::contains)
.collect(Collectors.toSet());
System.out.println("Union : " + union);
System.out.println("Intersection : " +intersection);
}
public static void main(String[] args){
List<Set<Integer>> listA = new ArrayList<>();
List<Set<Integer>> listB = new ArrayList<>();
listA.stream()
.forEach(a -> {
listB.stream()
.forEach(b -> unionAndIntersection(a, b));
});
}