Java将文本文件读入流并将其拆分

Java将文本文件读入流并将其拆分,java,file,split,java-8,java-stream,Java,File,Split,Java 8,Java Stream,我想读取一个带有流的文本文件并将其保存到数组中 假设我的文本文件如下所示 ;评释书 G40 K88 F32 H38 ; 诺赫·艾因·科门塔尔 B55 H33 K34 Bla77 现在我想要一个数组或数组列表,如下所示 G40 K88 F32 H38 B55 H33 K34 Bla77 所以我想删除以“;”开头的行,并在空格后拆分其他所有内容 我试着这样做: List<String> list = new ArrayList<>(); try (Stream&

我想读取一个带有流的文本文件并将其保存到数组中

假设我的文本文件如下所示

;评释书
G40 K88 F32
H38
; 诺赫·艾因·科门塔尔
B55
H33 K34 Bla77

现在我想要一个数组或数组列表,如下所示

G40
K88
F32
H38
B55
H33
K34
Bla77
所以我想删除以“;”开头的行,并在空格后拆分其他所有内容

我试着这样做:

 List<String> list = new ArrayList<>();

    try (Stream<String> stream = Files.lines(Paths.get(path))) {


        list = stream
                .filter(line -> !line.startsWith(";"))
        //  .map(string -> list.split(" "))
                .map(String::toUpperCase)
                .collect(Collectors.toList());

    } catch (IOException e) {
        e.printStackTrace();
    }

    list.forEach(System.out::println);
使用函数.map(string->list.split(“”),我将得到此错误
类型列表的方法split(string)未定义


我是Java新手,经过几个小时的搜索,我找不到答案。希望这里有人能给我一个提示。感谢

拆分行并创建包含其元素的流

line -> Stream.of(line.split("\\s+"))
//OR 
//line -> Arrays.stream(line.split("\\s+"))
这个lambda创建
,但是如果我们将它与
映射一起使用
like

map(line -> Stream.of(line.split("\\s+")))
我们将获得
。这不是我们想要的,因为我们不想在流上“迭代”,而是在它的元素上。因此,我们想要“展平”这个结构,以获得

这可以通过以下方式实现:

flatMap(line -> Stream.of(line.split("\\s+")))
这个怎么样

list = stream
     .filter(line -> !line.startsWith(";"))           // filters out comments
     .map(String::toUpperCase)                        // uppercase
     .flatMap(string -> Stream.of(string.split(" "))) // flattens the split array to the 
                                                      // Stream elements and adds to the 
                                                      // current Stream
     .collect(Collectors.toList());                   // as List
返回一个流,该流由将提供的映射函数应用于每个元素(来自文档)而生成的映射流的内容替换该流的每个元素的结果组成


非常好的例子在上。

对于一行式解决方案,请尝试:

Files.lines(Paths.get("your/file/path"))
     .filter(l -> !l.startsWith(";"))
     .flatMap(l -> Arrays.stream(l.split("\n")))
     .forEach(System.out::println);
Files.lines(Paths.get("your/file/path"))
     .filter(l -> !l.startsWith(";"))
     .flatMap(l -> Arrays.stream(l.split("\n")))
     .forEach(System.out::println);