【问题标题】:How to collect to a List using streams returning my own List implementation? [duplicate]如何使用返回我自己的列表实现的流收集到列表? [复制]
【发布时间】: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


【解决方案1】:

假设MyList类型是Collection,你可以使用Collectors.toCollection

MyList<String> list2 = aList.stream().collect(toCollection(MyList::new));

【讨论】:

  • 这也假设 MyList 是可变的。
  • @bowmore 好吧,如果add 方法抛出UnsupportedOperationException,那么将Stream 收集到其中没有多大意义,对吧?
  • @bowmore:显然,问题中的 OP 也是如此。
  • 我只是补充答案,对你来说可能很明显,对 OP 来说可能不是。
猜你喜欢
  • 2016-01-15
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多