【问题标题】:How to use map for lowercase or uppercase in Java 8 Streams?如何在 Java 8 Streams 中将 map 用于小写或大写?
【发布时间】:2021-09-16 20:28:08
【问题描述】:

我正在使用 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"))) 当“V”为大写时我得到String index out of range -1。我该如何解决?任何反馈都将不胜感激。

【问题讨论】:

  • 先将所有内容都转换为小写?
  • substring 不需要两张地图:x.substring(x.lastIndexOf(...) + 2)
  • 你也可以x.replaceAll(".*(\d+)$", "$1")

标签: java string java-8 java-stream


【解决方案1】:

有多种方法,这些只是其中的几种:

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

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

    .map(x -> x.replaceAll(".*(\\d+)$", "$1"))
    

    那么V的情况就没有关系了。

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

    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))
    

【讨论】:

  • 反斜杠应该在正则表达式中转义...也许你想明确添加[vV]
  • @Matt 我认为V 本身并不重要;这只是在尾随数字之前发生的事情。
  • Java 9 引入了Integer.parseInt(s,beginIndex,endIndex,radix)),它允许跳过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...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多