为了账号安全,请及时绑定邮箱和手机立即绑定

将带条件的循环转换为流

将带条件的循环转换为流

小唯快跑啊 2021-12-30 20:12:15
我正在尝试将我几个月前制作的常规循环转换为 java 8streams我对流的了解不多,因为我几天前才开始使用 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 流的尝试。我不明白的是如何从原始循环中设置布尔值部分。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());}
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我把它变成了一个带有处理条件的方法的类。将其设为类的原因是 temp、annotations 和 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);

        }

    }

}


查看完整回答
反对 回复 2021-12-30
?
慕斯709654

TA贡献1840条经验 获得超5个赞

创建助手类,如下所示:


class Helper {

    StringBuilder temp = new StringBuilder();

    boolean shouldAdd = false;


    String checkStart(String line) {

       if (line.startsWith(".annotation")) {

          shouldAdd = true;

       }

       if (shouldAdd) {

          temp.append(line).append("\n");

       }

       return line;

   }


   SmaliAnnotation createAnnotation(String trim) {

        shouldAdd = false;

        SmaliAnnotation res = new SmaliAnnotation(temp.toString());

        temp.setLength(0);

        return res;

    }

}

然后你可以写


StringBuilder temp = new StringBuilder();

Helper helper = new Helper();

return lines.stream()

        .filter(str -> str != null && !str.isEmpty())

        .map(line -> hasPadding ? line.trim() : line)

        .map(helper::checkStart)

        .filter(trim->trim.equalsIgnoreCase(".end annotation"))

        .map(helper::createAnnotation)

        .collect(Collectors.toList());

您可以最小化辅助类并尝试内联该方法:


class Helper {

    boolean shouldAdd = false;

}


StringBuilder temp = new StringBuilder    Helper helper = new Helper();

return lines.stream()

        .filter(str -> str != null && !str.isEmpty())

        .map(line -> hasPadding ? line.trim() : line)

        .map((String line) -> {

           if (line.startsWith(".annotation")) {

              helper.shouldAdd = true;

           }

           if (helper.shouldAdd) {

              temp.append(line).append("\n");

           }

           return line;

        })

        .filter(trim->trim.equalsIgnoreCase(".end annotation"))

        .map((String trim) -> {

            helper.shouldAdd = false;

            SmaliAnnotation res = new SmaliAnnotation(temp.toString());

            temp.setLength(0);

            return res;

        })

        .collect(Collectors.toList());

注意我什至没有尝试编译这段代码。


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信