Suseika Suseika - 1 year ago 83
Java Question

Is there a Collector that collects to an order-preserving Set?

Collectors.toSet()
does not preserve order. I could use Lists instead, but I want to indicate that the resulting collection does not allow element duplication, which is exactly what
Set
interface is for.

Answer Source

You can use toCollection and provide the concrete instance of the set you want. For example if you want to keep insertion order:

Set<MyClass> set = myStream.collect(Collectors.toCollection(LinkedHashSet::new));

For example:

public class Test {    
    public static final void main(String[] args) {
        List<String> list = Arrays.asList("b", "c", "a");

        Set<String> linkedSet = 
            list.stream().collect(Collectors.toCollection(LinkedHashSet::new));

        Set<String> collectorToSet = 
            list.stream().collect(Collectors.toSet());

        System.out.println(linkedSet); //[b, c, a]
        System.out.println(collectorToSet); //[a, b, c]
    }
}
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download