public static <OutputType, Type1, Type2> Set<OutputType> joinSets(Set<Type1> set1, Function<Type1, OutputType> converter1,
                                                                      Set<Type2> set2, Function<Type2, OutputType> converter2) {
        return new ConvertedSetView<>(set1, converter1, set2, converter2);
    }
public static < OutputType , Type1 , Type2 > Set < OutputType > joinSets ( Set < Type1 > set1 , Function < Type1 , OutputType > converter1 , Set < Type2 > set2 , Function < Type2 , OutputType > converter2 ) { return new ConvertedSetView < > ( set1 , converter1 , set2 , converter2 ) ; }
Returns an unmodifiable Set View made up of the given Sets while translating the items into a common type. The returned
Set View does not copy any of the data from any of the given Sets, therefore any changes in the two Sets will be
reflected in the View.

NOTE: The iterator of this SetView will not de-duplicate items, so if the two Sets are not disjoint, of if the converter
functions yield the same value for different inputs, the same item may appear multiple times.

@param set1         The first Set, which contains items of type Type1.
@param converter1   A Function that translates from Type1 to OutputType.
@param set2         The second Set, which contains items of type Type2.
@param converter2   A Function that translates from Type2 to OutputType.
@param <OutputType> The type of the items in the returned Set View.
@param <Type1>      The type of the items in Set 1.
@param <Type2>      The type of the items in Set 2.
@return A new Set View made up of the two Collections, with translation applied.