Gra*_*oss 1 java queue java-stream
假设我有一个Queue<String>
,我想清空队列的当前内容并对每个元素做一些事情。使用循环我可以做类似的事情:
while (true) {
String element = queue.poll();
if (element == null) {
return;
}
System.out.println(element);
}
Run Code Online (Sandbox Code Playgroud)
这感觉有点丑。我可以用流做得更好吗?
请注意,可能有其他线程同时访问队列,因此依赖队列的大小来知道要轮询的项目数量很容易出错。
既然您问的是“无阻塞”,那么您似乎指的是BlockingQueue
. 在这种情况下,建议避免重复调用poll()
.
相反,将所有待处理元素一次性转移到本地集合,然后处理它们:
List<String> tmp = new ArrayList<>();
queue.drainTo(tmp);
tmp.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
您还可以避免System.out
(隐式)多次同步:
List<String> tmp=new ArrayList<>();
queue.drainTo(tmp);
System.out.println(tmp.stream().collect(Collectors.joining(System.lineSeparator())));
Run Code Online (Sandbox Code Playgroud)
或者
List<String> tmp=new ArrayList<>();
queue.drainTo(tmp);
System.out.println(String.join(System.lineSeparator(), tmp));
Run Code Online (Sandbox Code Playgroud)
(虽然这不承担流操作)...
归档时间: |
|
查看次数: |
1984 次 |
最近记录: |