我想创建一个流,在创建后可以在其中放置元素:
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();
答案 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<Task> getAll(){
Stream.Builder<Task> all2 = Stream.builder();
all2.add(item1);
..
return all2.build();
}