如何使用stream或lambda简化我的代码

时间:2017-12-02 10:46:15

标签: java string lambda java-stream

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;
}

如何使用stream或lambda简化代码 我是初学者,我想了解更多有关lambda和stream的信息 谢谢你的帮助...

3 个答案:

答案 0 :(得分:3)

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

  • 不要逐字逐句地连接字符串。使用StringBuilder
  • 当条件相互排斥时,使用else if而不是两个if(字符c将永远不会同时其中一个&#34 ; abcde&#34; &#34; vwxyz&#34;)
  • 如果要检查的字符在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();
}

答案 1 :(得分:2)

如果您不打算并行运行代码,那么Janos的答案很棒,但我们应该努力通过简单地切换并行中间操作来制作可以轻松并行化的代码。 / p>

所以,使用streams / lambdas转换你的代码;在if中间操作中使用filter条件标准,利用map在if语句中执行逻辑,然后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()中间操作即可轻松并行化。

答案 2 :(得分:0)

使用以下代码:

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");
  }