我想读取带有流的文本文件并将其保存到数组中。
让我的文本文件看起来像这样
div
现在我想要一个看起来像这样的数组或arraylist
; Kommentar
G40 K88 F32
H38
; noch ein Kommentar
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(“”)),我会收到此错误G40 K88 F32
H38
B55
H33 K34 BLA77
我是Java新手,经过数小时的搜索,我找不到答案。希望有人可以给我提示。谢谢
答案 0 :(得分:1)
要分割线并创建包含其元素的流,请使用
line -> Stream.of(line.split("\\s+"))
//OR
//line -> Arrays.stream(line.split("\\s+"))
此lambda会创建Stream<String>
,但如果我们将其与map
一起使用,例如
map(line -> Stream.of(line.split("\\s+")))
我们将得到Stream<Stream<String>>
。这不是我们想要的,因为我们不想“迭代”流,而是要“迭代”其元素。因此,我们想“展平”此结构以获得Stream<String>
。
这可以通过
实现flatMap(line -> Stream.of(line.split("\\s+")))
答案 1 :(得分:1)
这个怎么样?
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
Stream::flatMap
返回一个流,该流包含将流中的每个元素替换为通过将提供的映射函数应用于每个元素而产生的映射流的内容的结果(来自文档)。
Baeldung's webpage上有很多很好的例子。
答案 2 :(得分:1)
对于一站式解决方案,请尝试:
Files.lines(Paths.get("your/file/path"))
.filter(l -> !l.startsWith(";"))
.flatMap(l -> Arrays.stream(l.split("\n")))
.forEach(System.out::println);