创建空流并向其中添加元素

时间:2019-08-25 20:11:47

标签: java java-stream

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

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();

2 个答案:

答案 0 :(得分: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()所示。

答案 1 :(得分:5)

对于Stream.Builder

来说,这似乎是一个完美的案例
Stream<Task> getAll(){
    Stream.Builder<Task> all2 = Stream.builder();

    all2.add(item1);
    ..

    return all2.build();
}