如何在Java8Streams中使用小写或大写映射?
我正在使用 java 流,但遇到了问题。我有这个代码:
clients.stream()
.map(Client::getDescription)
.map(x -> x.substring(x.lastIndexOf("_v")))
.map(x -> x.substring(2))
.mapToInt(Integer::parseInt)
.max()
.getAsInt();
每个客户端的描述可能是“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”是大写的。我该如何解决?任何反馈都将受到赞赏。
回答
有多种方法,这些只是一些:
-
按照Sweeper 的建议,将整个字符串小写。这意味着
V将转换为v,因此您可以使用 找到它lastIndexOf。 -
使用正则表达式替换您不想要的字符串部分,即除尾随数字之外的所有内容:
.map(x -> x.replaceAll(".*(d+)$", "$1"))那么对于
V. -
编写一个查找尾随数字的小方法:
String trailingDigits(String x) { int last = x.length(); while (last > 0 && Character.isDigit(x.charAt(last - 1)) { --last; } return x.substring(last); }并从您的地图调用:
.map(x -> trailingDigits(x))
- @Matt 我认为 `V` 本身并不重要;这只是在尾随数字之前发生的事情。
- 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`......