Java 8 Stream,按条件添加一个元素列出很多时间;

时间:2015-03-31 10:04:19

标签: java java-8 java-stream

我有这样的行↓从列表中获取确切的元素,但我想多次添加它使用某种类型的数组,如“for”与计数器

list.stream().filter(x -> x.getUserID() == user.getUserID()).collect(Collectors.toList());
list.stream().map(o -> new Object[] { (Object) o }).collect(Collectors.toList();

我有类似的代码,但我不想使用double:

List<Object[]> tmp = new ArrayList<Object[]>();
for (Iterator<?> iterator = tests.getTestData().iterator(); iterator.hasNext();) {
    Object objects = iterator.next();
    //should have condition like id=id
    for (int i = 0; i < t.getInvocationCount(it); i++) {
        tmp.add(new Object[] { objects });
    }
}

可以使用流来满足条件的多个元素吗?

修改

*tests.getTestData() -> returns List
**t.getInvocationCount -> returns int [t is not important cause it is generic]

我只需要arry中的多个元素,通知

FOR arry TO arry=END DO:
  IF arry[i] IS statment=true DO:
    FOR 0 TO outsideCounter_i DO:
      tempArry.add(arry[i])

其中*为arry,**为outsideCounter

如果statment使用stream,我想要多个元素。 如果仍不清楚请添加评论。

我读到了关于nCopies的内容并且它很酷,但我可以在流内使用它吗?

1 个答案:

答案 0 :(得分:7)

您可以使用IntStream作为复制元素的索引。

这样的东西应该有效(我不完全确定你的两个代码片段是如何相关的,所以我可能错了名字):

List<Object[]> tmp =
    tests.getTestData().stream()
        .filter(x -> x.getUserID() == user.getUserID())  // not sure about this
                                                         // part, since it's not
                                                         // clear if the elements 
                                                         // of the input 
                                                         // Iterable have a 
                                                         // getUserID method
        .flatMap (x -> IntStream.range(0,t.getInvocationCount(it)).mapToObj(i -> x))
        .map(o -> new Object[] {o})
        .collect (Collectors.toList());

正如aioobe评论的那样,Collections.nCopies方法在这里很有用:

List<Object[]> tmp =
    tests.getTestData().stream()
        .filter(x -> x.getUserID() == user.getUserID())  // not sure about this
                                                         // part, since it's not
                                                         // clear if the elements 
                                                         // of the input 
                                                         // Iterable have a 
                                                         // getUserID method
        .flatMap (o -> Collections.nCopies(t.getInvocationCount(it),o).stream())
        .map (o -> new Object[] {o})
        .collect (Collectors.toList());