【发布时间】:2015-03-09 12:31:30
【问题描述】:
使用流 API;过滤相关数据后,我想编辑正在收集的数据。到目前为止的代码如下:
String wordUp = word.substring(0,1).toUpperCase() + word.substring(1);
String wordDown = word.toLowerCase();
ArrayList<String> text = Files.lines(path)
.parallel() // Perform filtering in parallel
.filter(s -> s.contains(wordUp) || s.contains(wordDown) && Arrays.asList(s.split(" ")).contains(word))
.sequential()
.collect(Collectors.toCollection(ArrayList::new));
编辑下面的代码很糟糕,我试图避免它。(它也不能完全工作。它是在凌晨 4 点完成的,请原谅。)
for (int i = 0; i < text.size(); i++) {
String set = "";
List temp = Arrays.asList(text.get(i).split(" "));
int wordPos = temp.indexOf(word);
List<String> com1 = (wordPos >= limit) ? temp.subList(wordPos - limit, wordPos) : new ArrayList<String>();
List<String> com2 = (wordPos + limit < text.get(i).length() -1) ? temp.subList(wordPos + 1, wordPos + limit) : new ArrayList<String>();
for (String s: com1)
set += s + " ";
for (String s: com2)
set += s + " ";
text.set(i, set);
}
它正在寻找文本文件中的特定单词,一旦过滤了该行,我希望每次只收集该行的一部分。正在搜索的关键字两侧的多个单词。
例如:
keyword = "the"
limit = 1
它会找到:"Early in the morning a cow jumped over a fence."
然后它应该返回:"in the morning"
*附注任何建议的速度改进都将被投票。
【问题讨论】:
-
我看不出你如何在代码中使用这个
limit... -
要修改元素,请使用流的map方法。
-
另外,如果
keyword是句子中的第一个并且limit是1,会发生什么? -
wordUp、wordDown和word有什么区别? -
在同一个流上调用
.parallel()和.sequential()是没有意义的。流是并行的或顺序的。请注意,collect与并行流完美配合。此外,您的状况x || y && z看起来很可疑;注意运算符的优先级。但目前还不清楚它应该做什么。
标签: java java-8 java-stream collectors