我是靠谱客的博主 无限太阳,最近开发中收集的这篇文章主要介绍Java 8流和Lambda表达式–解析文件示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近,我想从输出日志中提取某些数据。 这是日志文件的一部分:

2015-01-06 11:33:03 b.s.d.task [INFO] Emitting: eVentToRequestsBolt __ack_ack [-6722594615019711369 -1335723027906100557]
2015-01-06 11:33:03 c.s.p.d.PackagesProvider [INFO] ===---> Loaded package com.foo.bar
2015-01-06 11:33:04 b.s.d.executor [INFO] Processing received message source: eventToManageBolt:2, stream: __ack_ack, id: {}, [-6722594615019711369 -1335723027906100557]
2015-01-06 11:33:04 c.s.p.d.PackagesProvider [INFO] ===---> Loaded package co.il.boo
2015-01-06 11:33:04 c.s.p.d.PackagesProvider [INFO] ===---> Loaded package dot.org.biz

我决定使用Java8 Stream和Lambda Expression功能来实现。

读取文件

首先,我需要读取日志文件并将这些行放入Stream中:

Stream<String> lines = Files.lines(Paths.get(args[1]));

过滤相关行

我需要获取软件包名称并将其写入另一个文件。 并非所有行都包含我需要的数据,因此仅过滤相关行。

lines.filter(line -> line.contains("===---> Loaded package"))

解析相关行

然后,我需要解析相关行。 我首先将每一行拆分为一个字符串数组,然后采用该数组中的最后一个元素来完成此操作。 换句话说,我做了一个双重映射 。 首先是数组的一行,然后是字符串的数组。

.map(line -> line.split(" "))
.map(arr -> arr[arr.length - 1])

写入输出文件

最后一部分是获取每个字符串并将其写入文件。 那是终端操作。

.forEach(package -> writeToFile(fw, package));

writeToFile是我创建的方法。 原因是Java文件系统抛出IOException。 您不能在lambda表达式中使用检查的异常。

这是一个完整的示例(注意,我不检查输入)

import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class App {
	public static void main(String[] args) throws IOException {
		Stream<String> lines = null;
		if (args.length == 2) {
			lines = Files.lines(Paths.get(args[1]));
		} else {
			String s1 = "2015-01-06 11:33:03 b.s.d.task [INFO] Emitting: adEventToRequestsBolt __ack_ack [-6722594615019711369 -1335723027906100557]";
			String s2 = "2015-01-06 11:33:03 b.s.d.executor [INFO] Processing received message source: eventToManageBolt:2, stream: __ack_ack, id: {}, [-6722594615019711369 -1335723027906100557]";
			String s3 = "2015-01-06 11:33:04 c.s.p.d.PackagesProvider [INFO] ===---> Loaded package com.foo.bar";
			String s4 = "2015-01-06 11:33:04 c.s.p.d.PackagesProvider [INFO] ===---> Loaded package co.il.boo";
			String s5 = "2015-01-06 11:33:04 c.s.p.d.PackagesProvider [INFO] ===---> Loaded package dot.org.biz";
			List<String> rows = Arrays.asList(s1, s2, s3, s4, s5);
			lines = rows.stream();
		}
		
		new App().parse(lines, args[0]);

	}
	
	private void parse(Stream<String> lines, String output) throws IOException {
		final FileWriter fw = new FileWriter(output);
		
		//@formatter:off
		lines.filter(line -> line.contains("===---> Loaded package"))
		.map(line -> line.split(" "))
		.map(arr -> arr[arr.length - 1])
		.forEach(package -> writeToFile(fw, package));
		//@formatter:on
		fw.close();
		lines.close();
	}

	private void writeToFile(FileWriter fw, String package) {
		try {
			fw.write(String.format("%s%n", package));
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

}

翻译自: https://www.javacodegeeks.com/2015/01/java-8-stream-and-lambda-expressions-parsing-file-example.html

最后

以上就是无限太阳为你收集整理的Java 8流和Lambda表达式–解析文件示例的全部内容,希望文章能够帮你解决Java 8流和Lambda表达式–解析文件示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部