How to collect a stream into a list that is a subtype that I specify?
In other words, I'd like this test to pass. What should I do on the commented line to convert a stream to a MyList
instance?
import org.junit.*;
import java.util.*;
import static java.util.stream.Collectors.*;
import static junit.framework.Assert.*;
@Test
public void collectUsingDifferentListType() {
List<String> aList = new ArrayList<>();
aList.add("A");
aList.add("B");
List<String> list1 = aList.stream().collect(toList());
MyList<String> list2 = aList.stream().collect(toList(MyList::new)); // this doesn't exist, but I wish it did
assertEquals(aList, list1);
assertEquals(ArrayList.class, list1.getClass());
assertEquals(aList, list2);
assertEquals(MyList.class, list1.getClass());
}
Get the stream of elements in which the duplicates are to be found. For each element in the stream, count the frequency of each element, using Collections. frequency() method. Then for each element in the collection list, if the frequency of any element is more than one, then this element is a duplicate element.
Assuming the MyList
type is a Collection
, you can use Collectors.toCollection
:
MyList<String> list2 = aList.stream().collect(toCollection(MyList::new));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With