gpt4 book ai didi

java - 将带条件的循环转换为流

转载 作者:太空宇宙 更新时间:2023-11-04 10:03:58 24 4
gpt4 key购买 nike

我正在尝试将几个月前制作的常规循环转换为 java 8 stream 由于几天前我刚刚开始使用 java 8,因此我对流没有太多了解。

这是我想要重新创建到流中的常规循环

public static List<SmaliAnnotation> getAnnotations(List<String> lines, boolean hasPadding) {
StringBuilder temp = new StringBuilder();
List<SmaliAnnotation> annotations = new ArrayList<>();
boolean shouldAdd = false;
for (String line : lines) {
String trim = hasPadding ? line.trim() : line;
if (trim.isEmpty()) continue;
if (trim.startsWith(".annotation")) {
shouldAdd = true;
}
if (shouldAdd) {
temp.append(line).append("\n");
}
if (trim.equalsIgnoreCase(".end annotation")) {
shouldAdd = false;
annotations.add(new SmaliAnnotation(temp.toString()));
temp.setLength(0);
}
}
return annotations;
}

我已经开始将其转换为 java 8 流,但我陷入了 shouldAdd 部分。我不知道如何用流来实现这一点。这是我制作java流的尝试。我不明白的是如何从原始循环中设置 boolean 部分。

public static List<SmaliAnnotation> getAnnotations(List<String> lines, boolean hasPadding) {
StringBuilder temp = new StringBuilder();
boolean shouldAdd = false;
return lines.stream()
.filter(str -> str != null && !str.isEmpty())
.map(line -> hasPadding ? line.trim() : line)
.map(SmaliAnnotation::new)
.collect(Collectors.toList());
}

最佳答案

我把它变成了一个带有处理条件的方法的类。使其成为一个类的原因是 temp、注释和 shouldAdd 变量,这些变量必须通过 doStuff 方法访问。您还需要稍微清理一下...将 doStuff 命名为适当的名称,等等。可能有更好的方法来做到这一点,但它使用流来完成可以用流完成的事情。

public class AnnotationBuilder {
private StringBuilder temp = new StringBuilder();
private List<SmaliAnnotation> annotations = new ArrayList<>();
private boolean shouldAdd;

private AnnotationBuilder() {
// no-op
}

public static List<SmaliAnnotation> getAnnotations(List<String> lines, boolean hasPadding) {
return new AnnotationBuilder().build(lines, hasPadding);
}

private List<SmaliAnnotation> build(List<String> lines, boolean hasPadding) {
lines.stream().map(line -> hasPadding ? line.trim() : line).filter(line -> !line.isEmpty()).forEach(line -> doStuff(line));
return annotations;
}

private void doStuff(final String cleanLine) {
if (cleanLine.startsWith(".annotation")) {
shouldAdd = true;
}
if (shouldAdd) {
temp.append(cleanLine).append("\n");
}
if (cleanLine.equalsIgnoreCase(".end annotation")) {
shouldAdd = false;
annotations.add(new SmaliAnnotation(temp.toString()));
temp.setLength(0);
}
}
}

关于java - 将带条件的循环转换为流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53155906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com