【发布时间】:2017-01-16 11:28:53
【问题描述】:
我有一个要求,我想使用 Java Stream Api 处理来自系统的事件流,并应用数据清理过程来删除重复的事件。 这是删除按顺序重复多次的同一事件,而不是创建不同事件的列表。大多数在线可用的 Java Stream api 示例都针对从给定输入创建不同的输出。
例如,输入流
[a,b,c,a,a,a,a,d,d,d,c,c,e,e,e,e,e,e,f,f,f]
输出列表或流应该是
[a, b, c, a, d, c, e, f]
我当前的实现(不使用 Stream api)看起来像
public class Test {
public static void main(String[] args) {
String fileName = "src/main/resources/test.log";
try {
List<String> list = Files.readAllLines(Paths.get(fileName));
LinkedList<String> acc = new LinkedList<>();
for (String line: list) {
if (acc.isEmpty())
acc.add(line);
else if (! line.equals(acc.getLast()) )
acc.add(line);
}
System.out.println(list);
System.out.println(acc);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
输出,
[a, b, c, a, a, a, a, d, d, d, c, c, e, e, e, e, e, e, f, f, f]
[a, b, c, a, d, c, e, f]
我尝试了各种使用 reduce、groupingBy 等的示例,但均未成功。如果有这样的可能性,我似乎找不到将流与累加器中的最后一个元素进行比较的方法。
【问题讨论】:
-
附带说明,请考虑阅读“When to use LinkedList over ArrayList?”。简单地说,你几乎不想使用
LinkedList... -
重复项一定是连续的吗?你能在后面加上另一个“a”,例如“d”吗?如果,是否应该将其删除?
-
@Mureinik 声明“这将删除按顺序重复多次的同一事件”已经涵盖了这种情况 IMO。
-
@CKing 出于某种原因,我完全跳过了那句话。过失。
-
@Amitoj 欢迎来到 Stack Overflow 和好问题。请阅读What should I do when someone answers my question。您的问题有 3 个答案。您可以留下 cmets 进行澄清或接受其中一个答案作为最能解决您的问题的答案。
标签: java java-8 java-stream