我对流媒体还很陌生,所以请帮助我(并保持温柔)。
我想做的是以下几点。我有一个BufferedReader
,它从一个文件中读取,其中每一行都看起来像这样:“ a,b”。例如:
示例输入文件
“ a,b”
“ d,e”
“ f,g”
我想将其转换为LinkedList<String[]>
:
示例LinkedList<String[]>
[{“ a”,“ b”},{“ c”,“ d”},{“ f”,“ g”}]
您将如何使用流方法做到这一点?
这是我尝试过的:
List numbers = reader.lines().map(s -> s.split("[\\W]")).collect(Collectors.toList());
这不起作用。我的IDE提供以下反馈:
Incompatible types. Required List but 'collect' was inferred to R: no instance(s) of type variable(s) T exist so that List<T> conforms to List
它显示...我仍在尝试找出流。
答案 0 :(得分:6)
首先,我建议避免使用原始类型,而应使用List<String[]>
作为接收器类型。
List<String[]> numbers = reader.lines()
.map(s -> s.split(delimiter)) // substitute with your deilimeter
.collect(Collectors.toList());
您提到要使用LinkedList
实现。您几乎应该总是偏爱ArrayList
,toList
默认情况下会当前返回,尽管不能保证持久存在,您可以使用toCollection
明确指定列表实现:
List<String[]> numbers = reader.lines()
.map(s -> s.split(delimiter)) // substitute with your deilimeter
.collect(Collectors.toCollection(ArrayList::new));
,对于LinkedList
同样如此:
List<String[]> numbers = reader.lines()
.map(s -> s.split(delimiter)) // substitute with your deilimeter
.collect(Collectors.toCollection(LinkedList::new));
答案 1 :(得分:4)
您可以这样做
replaceResource() {
// 'replace-file-input' is a file input html element
const element: HTMLElement = document.getElementById('replace-file-input') as HTMLElement;
// if I put "element.click()" here, eveything works fine.
// the next line is a subscription of the http request, I want to trigger the click event when I get the response back.
this.service.checkStatus(this.id).subscribe(
status => {
if (status) {
// here is the problem, the file input dialog should be opened, but nothing happened
element.click()
}
}
)
}
读取文件的每一行,然后使用定界符将其拆分。修剪之后,消除剩余的空白字符。最后将其收集到结果容器中。
答案 2 :(得分:4)
假设每行是2个元素的元组,则可以将它们收集到看起来像2个元素的元组的列表中。 请注意,Java没有元组的本机类型(例如Scala或python),因此您应该选择一种表示元素的方式。
您可以创建一个条目列表:
List<Map.Entry<String, String>> numbers =
reader.lines()
.map(s -> s.split(","))
.map(a -> new AbstractMap.SimpleEntry<>(a[0], a[1]))
.collect(Collectors.toList());
或String列表:
List<String> numbers = reader.lines()
.map(s -> s.split(","))
.map(a -> "{" + a[0] + "," + a[1] + "}"))
.collect(Collectors.toList());
请注意,通常,您在收集流时不希望遵循特定的列表实现,而在某些情况下可能需要。在这种情况下,请指定与
toCollection(LinkedList::new)
代替toList()