【发布时间】:2015-10-23 10:46:48
【问题描述】:
如何将流收集到我指定的子类型列表中?
换句话说,我希望通过这个测试。在注释行中我应该怎么做才能将流转换为MyList 实例?
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());
}
【问题讨论】:
-
第一个断言是错误的。返回的
toList()列表恰好是Oracle 当前实现中的ArrayList,但没有规范可以保证这一点。另一方面,第二个断言没有多大用处,因为如果list2不属于MyType,则操作失败并返回ClassCastException(除非您考虑创建虚假子类的可能性)……而您那里有一个复制和粘贴错误。
标签: java java-8 java-stream collectors