Java:使用lambda为文件添加行号的优雅方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java:使用lambda为文件添加行号的优雅方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2238字,纯文字阅读大概需要4分钟。
内容图文
![Java:使用lambda为文件添加行号的优雅方法](/upload/InfoBanner/zyjiaocheng/805/a8ac964e23d94f469ae41e6d63a4ac86.jpg)
我习惯使用lambda逐行解析文件(比bufferedReader.readLine()更整洁).但今天我遇到了一个问题:为每一行添加一个行号.
它需要一个计数器,但lambda中的变量应该是最终的.最后,我用一个int数组攻击它.
码:
public static void main(String[] args) {
int[] counter = new int[1];
counter[0] = 0;
try (Stream<String> lines = Files.lines(Paths.get("/tmp/timeline.txt"), Charset.defaultCharset())) {
lines.limit(10).forEachOrdered(line -> {
line = line.trim();
counter[0] ++;
System.out.println("Line " + counter[0] + ": " + line);
});
} catch (IOException e) {
e.printStackTrace();
}
}
输出:
Line 1: p 5714026 wEkQ
Line 2: v 8235889
Line 3: v 6534726
...
我的问题是,如何避免我的黑客并优雅地解决这个问题?
解决方法:
对于非功能性任务没有优雅的功能解决方案.你可以考虑的第一个就是诉诸普通的匿名内部类:
String path = "/tmp/timeline.txt";
try(Stream<String> lines = Files.lines(Paths.get(path), Charset.defaultCharset())) {
lines.limit(10).forEachOrdered(new Consumer<String>() {
int counter = 0;
public void accept(String line) {
System.out.println("Line " + counter++ + ": " + line.trim());
}
});
} catch (IOException e) {
e.printStackTrace();
}
优点是它不会伪装成功能,并且计数器变量的范围具有此任务所需的最小范围.
如果您要做的不仅仅是打印这些编号的行并且需要与所有流操作兼容的解决方案,重新实现流源是一个直接的解决方案:
static Stream<String> numberedLines(Path path, Charset cs) throws IOException {
BufferedReader br = Files.newBufferedReader(path, cs);
return StreamSupport.stream(new Spliterators.AbstractSpliterator<String>(
Long.MAX_VALUE, Spliterator.ORDERED|Spliterator.NONNULL) {
int counter;
public boolean tryAdvance(Consumer<? super String> action) {
String line;
try {
line = br.readLine();
if(line==null) return false;
action.accept("Line " + counter++ + ": " + line.trim());
return true;
} catch (IOException ex) {
throw new UncheckedIOException(ex);
}
}
}, true).onClose(()->{ try { br.close(); }
catch (IOException ex) { throw new UncheckedIOException(ex); }
});
}
当然,这并不像单个lambda表达式那么简单,但使用这种可重用的方法,您可以毫无问题地使用所有流操作,例如:
String path = "/tmp/timeline.txt";
try(Stream<String> lines = numberedLines(Paths.get(path), Charset.defaultCharset())) {
lines.skip(10).limit(10).forEachOrdered(System.out::println);
} catch(IOException e) {
e.printStackTrace();
}
内容总结
以上是互联网集市为您收集整理的Java:使用lambda为文件添加行号的优雅方法全部内容,希望文章能够帮你解决Java:使用lambda为文件添加行号的优雅方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。