如何拆分字符串流并生成字符串数组列表?

时间:2019-01-03 15:25:11

标签: java java-8 java-stream incompatibletypeerror

我对流媒体还很陌生,所以请帮助我(并保持温柔)。

我想做的是以下几点。我有一个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

它显示...我仍在尝试找出流。

3 个答案:

答案 0 :(得分:6)

首先,我建议避免使用原始类型,而应使用List<String[]>作为接收器类型。

List<String[]> numbers = reader.lines()
                               .map(s -> s.split(delimiter)) // substitute with your deilimeter
                               .collect(Collectors.toList());

您提到要使用LinkedList实现。您几乎应该总是偏爱ArrayListtoList默认情况下会当前返回,尽管不能保证持久存在,您可以使用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()