【发布时间】:2015-11-20 08:49:47
【问题描述】:
我需要解析一个由不同整数组成的字符串,这些整数代表某个用户看电视或不看电视的时间段。
我首先拆分字符串并将其收集到一个 ArrayList 中:
final List<String> separated = stream(split(s, "A"))
.map(str -> "A" + str)
.flatMap(str -> stream(split(str, "B")).map(s2 -> s2.startsWith("A") ? s2 : "B" + s2))
collect(Collectors.toList());
棘手的事情现在来了。我需要将这些字符串转换为具有from/to 字段的域对象。
所以,为了正确映射它,我的映射函数需要知道前一个元素。所以我做了以下事情:
LocalDateTime temp = initial;
final ArrayList<WatchingPeriod> result = new ArrayList<>();
for (final String s1 : separated) {
final WatchingPeriod period = new WatchingPeriod(temp, temp.plusMinutes(parseLong(substring(s1, 1))),
s1.startsWith("A"));
result.add(period);
temp = period.getTo();
}
return result;
我觉得这是一个巨大的倒退,因为我打破了整个流管道只是为了回到旧学校 for-each。
有什么方法可以在一个流管道中完成整个处理?我正在考虑创建一个自定义收集器,它会查看集合中的最后一个元素并基于此计算正确的 LocalDateTime 对象。
例子:
输入字符串:“A60B80A60”,表示有人看了60分钟,然后停了80分钟,又看了60分钟
因此我想获得一个包含对象的列表:
1) 从:0:00,到:1:00,观看:true
2) 从:1:00,到:2:20,观看:假
3) 从:2:20,到:3:20,观看:true
计算每个对象都需要了解前一个对象
【问题讨论】:
-
您能提供输入字符串的样本吗? (以及想要的输出?)
-
@RobAu,我刚刚编辑了我的答案
-
重复问题的答案应该包含足够的信息:)
标签: java string java-8 java-stream