使用 Java Streams 使用 continue 语句重写 do-while 循环

问题描述 投票:0回答:1

我正在尝试用 Function Java 重写以下代码。 str 是一个管道 |和 equal = 分隔字符串,其中包含 FieldName1=FieldValue1|FieldName2=FieldValue2|... 依此类推... 此代码查找字段名称的第一次出现,并查找由 = 符号分割的相应值。有什么办法可以继续使用Functional Java吗?

示例输入 str=债券=US922646AS37|Isin=US922646AS37|Cusip=922646AS3|价格=100.5|货币=美元|持仓=2000000|.......|债券=US69318FAJ75|Isin=US69318FAJ75|Cusip=69318FAJ7|价格=102.5|货币=美元|持仓=1000000|.....

字段名称=价格

startIdx=100

输出:102.5

String process(String fieldName, int startIdx, String str) {
        do {
            int start = str.indexOf(fieldName, startIdx);
            if (start == -1) {
                return null;
            }
            if ( start > 0 && str.charAt(start-1) != '|' ) {
                startIdx = start+1;
                continue;
            }
            int val = str.indexOf("=", start);
            if ( val == -1 ) {
                return null;
            }
            if (val - fieldName.length() != start) {
                int end = str.indexOf("|", startIdx);
                if (end == -1) {
                    return null; 
                }
                start = end + 1;
                continue;
            }
            int end = str.indexOf("|", val);
            if (end == -1) {
               return str.substring(val + 1);
            } else {
              return str.substring(val + 1, end);
            }
    } while (true);
}
java functional-programming
1个回答
0
投票

这是一种方法。

  • 首先在管道上裂开。
  • 然后在等号上分开。这会将三个数组放入流中。
  • 他们把它们放在地图上。
 String s = "FieldName1=FieldValue1|FieldName2=FieldValue2|FieldName3=FieldValue3";

 Map<String, String> map = Arrays.stream(s.split("\\|")).map(str -> str
         .split("=")).collect(Collectors.toMap(arr -> arr[0], arr-> arr[1]));

map.forEach((k,v)->System.out.printf("%s -> %s%n", k, v));

打印

FieldName3 -> FieldValue3
FieldName2 -> FieldValue2
FieldName1 -> FieldValue1
© www.soinside.com 2019 - 2024. All rights reserved.