【问题标题】:How to simplify my code using stream or lambda如何使用流或 lambda 简化我的代码
【发布时间】:2017-12-02 10:46:14
【问题描述】:
String convSummary(String l) {
    String s = l.toLowerCase(), r ="";
    for(int i = 0 ; i < s.length() ;i++){
        char c = s.charAt(i);
        if(c == 'a' || c == 'b' || c == 'c' || c == 'd' || c == 'e')
            r += (char) (c & 0x5f);
        if(c == 'v' || c == 'w' || c == 'x' || c == 'y' || c == 'z')
            r += c;
    }
    return r;
}

如何使用流或 lambda 简化代码 我是初学者,我想了解更多关于 lambda 和 stream 感谢您的帮助...

【问题讨论】:

    标签: java string lambda java-stream


    【解决方案1】:

    您可以使用String.chars() 来获取字符流, 但这里还有更重要的优化:

    • 不要逐个字符地连接字符串。使用StringBuilder
    • 当条件互斥时使用else if 而不是两个if(一个字符c 永远不会同时是“abcde”之一 em> "vwxyz")
    • 如果要检查的字符在 ASCII 范围内,请在该范围内使用条件,而不是逐个检查值

    综合以上内容:

    String convSummary2(String s) {
        StringBuilder sb = new StringBuilder();
        s.chars().map(Character::toLowerCase).forEach(c -> {
            if ('a' <= c && c <= 'e') {
                sb.append((char)(c & 0x5f));
            } else if ('v' <= c && c <= 'z') {
                sb.append((char) c);
            }
        });
        return sb.toString();
    }
    

    【讨论】:

      【解决方案2】:

      如果您不打算并行运行代码,那么 Janos 的回答很好,但我们应该努力始终通过简单地打开并行中间操作来使代码易于并行化。

      因此,使用流/lambda 转换您的代码;在filter中间操作中使用if条件条件,在if语句中使用map做逻辑,然后collect变成一个字符串。

      return
            s.toLowerCase()
             .chars()
             .filter(i -> 'a' <= i && i <= 'e' ||
                          'v' <= i && i <= 'z')
             .map(i -> 'a' <= i && i <= 'e' ?
                        (char)(i & 0x5f) :
                        (char)i)
             .mapToObj(i -> Character.toString((char)i))
             .collect(Collectors.joining());
      

      您只需调用parallel() 中间操作即可轻松实现并行化。

      【讨论】:

        【解决方案3】:

        使用以下代码:

        int z=(int)c;
          if(z>=97 && z<=101) //these are the ascii value of the letters
          {
            //code for if c is either a,b,c,d,e   
            System.out.println("a,b,c,d,e");
          }
          else if(z>=118 && z<=122){
              //code for if c is either v,w,x,y,z
              System.out.println("v,w,x,y,z");
          }
        

        【讨论】:

        • 97 替换'a' 或用101 替换'e' 有什么意义?您无缘无故地降低了代码的可读性,因此需要像 //these are the ascii value of the letters 这样的澄清注释,这仍然需要读者付出额外的努力才能找出这些数字对应的字母……
        • 我自己提交时没有查看上述解决方案
        猜你喜欢
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        相关资源
        最近更新 更多