如何在 Java 8 Streams 中使用小写或大写映射?

elv*_*vis 1 java string java-8 java-stream

我正在使用 java 流,但遇到了问题。我有这个代码:

clients.stream()
                    .map(Client::getDescription)
                    .map(x -> x.substring(x.lastIndexOf("_v")))
                    .map(x -> x.substring(2))
                    .mapToInt(Integer::parseInt)
                    .max()
                    .getAsInt();
Run Code Online (Sandbox Code Playgroud)

每个客户端的描述可能是“John_abc_v1”、“Bill_crce_v2”、“Joe_ghhj_V3”……我得到了最大值,在这种情况下是 3……但问题是 v 可以是小写或大写,而我没有知道如何解决,所以这行不工作 .map(x -> x.substring(x.lastIndexOf("_v"))),我得到String index out of range -1的时候“V”是大写的。我该如何解决?任何反馈都将受到赞赏。

And*_*ner 5

有多种方法,这些只是一些:

  1. 按照Sweeper 的建议,将整个字符串小写。这意味着V将转换为v,因此您可以使用 找到它lastIndexOf

  2. 使用正则表达式替换您不想要的字符串部分,即除尾随数字之外的所有内容:

    .map(x -> x.replaceAll(".*(\\d+)$", "$1"))
    
    Run Code Online (Sandbox Code Playgroud)

    那么对于V.

  3. 编写一个查找尾随数字的小方法:

    String trailingDigits(String x) {
      int last = x.length();
      while (last > 0 && Character.isDigit(x.charAt(last - 1)) {
        --last;
      }
      return x.substring(last);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    并从您的地图调用:

    .map(x -> trailingDigits(x))
    
    Run Code Online (Sandbox Code Playgroud)

  • @Matt 我认为 `V` 本身并不重要;这只是在尾随数字之前发生的事情。 (3认同)
  • Java 9 引入 [`Integer.parseInt(s,beginIndex,endIndex,radix))`](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang /Integer.html#parseInt(java.lang.CharSequence,int,int,int)) 允许跳过 `substring` 操作。因此,您可以将 `String trailingDigits(String x)` 更改为 `static int trailingNumber(String x)` 并将其 `return x.substring(last);` 更改为 `return Integer.parseInt( x, last, x.length() , 10);`。然后,单个 `mapToInt(ContainingClass::trailingNumber)` 就足够了......对于 Java 8,我仍然使用 `trailingNumber` 方法来处理 `substring`/`parseInt`...... (2认同)