0

我想要一个流,我可以在创建后放置元素:

Stream<Task> all2 = Stream.of();

因为该方法的返回类型也是 Stream 并且我想通过使用列表来避免额外的成本并且需要return list.stream()

Stream<Task> getAll(){
    Stream<Task> all2 = Stream.of();

    all2.add(item1);
    ..

    return all2
}

但是如何添加元素以all2进行进一步处理?

这是做到这一点的唯一方法:

Stream<Task> all2 = Stream.of();
all2 = Stream.concat(all2, Stream.of(new Task("hello")));
...
all2 = Stream.concat(all2, Stream.of(new Task("hello_1000000")));

这真的比使用列表并向其中添加元素便宜吗?

List<Task> all = new ArrayList<>();
all.add(new Task("hello");
...
all.add(new Task("hello_1000000");
return all.stream();
4

2 回答 2

6

阅读评论你可能需要一个Stream无限生成的元素。Stream::generate这样做:

import java.util.Scanner;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {

        getStream()
                .forEach(System.out::println);

    }

    static String getUserInput(Scanner scanner) {
        return scanner.nextLine();
    }

    static Stream<String> getStream() {
        Scanner sc = new Scanner(System.in);

        return Stream.generate(() -> getUserInput(sc)).takeWhile(Predicate.not(String::isEmpty));
    }
}

使用这种方法,您有一个Stream<String>,它将等待用户输入元素(无限期,或直到第一个错误或empty()字符串)并将流操作应用于每个元素(在这种情况下,forEach- 如中所示main())。

于 2019-08-25T20:27:27.010 回答
5

它看起来像是Stream.Builder的完美案例

Stream<Task> getAll(){
    Stream.Builder<Task> all2 = Stream.builder();

    all2.add(item1);
    ..

    return all2.build();
}
于 2019-08-25T20:44:14.240 回答