【问题标题】:Java 8: Converting an array of strings to have first character in uppercase and sorted orderJava 8:将字符串数组转换为第一个字符为大写并排序
【发布时间】:2018-04-28 05:25:53
【问题描述】:

我有一个字符串数组,例如:

String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };

我希望它把它转换成一个数组,这样给定数组中的所有字符串的第一个字符都是大写的。预期输出应该是:

[Blue, Green, Magenta, PURPLE, Red, Violet, Yellow]

最后应该对数组进行排序(这个很简单,只需添加sorted()操作)。

我正在尝试,但它不起作用:

System.out.println(Arrays.stream(strArray)
                .map((String x) -> {x=(x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "");})
                .sorted()
                .collect(Collectors.toList()));

我收到此错误:

The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments ((String x) -> {})

我确定我错过了一些小东西,但我无法弄清楚是什么。

【问题讨论】:

  • 一个简单的印刷错误。 lambda 表达式必须为return 一个值,而不是为参数赋值。所以你必须写.map((String x) -&gt; { return (…);}),而不是.map((String x) -&gt; {x=(…);}),或者使用简写形式.map(x -&gt; (…))

标签: java arrays string java-8 java-stream


【解决方案1】:

您可以为此使用Character.toUpperCase() 方法。

System.out.println(Arrays.stream(strArray)
            .filter(Objects::nonNull)
            .map(s->Character.toUpperCase(s.charAt(0))+ s.substring(1))
            .sorted()
            .collect(Collectors.toList()));

【讨论】:

  • 这里的 sorted() 方法中不需要 Comparator,默认与Comparator.comparing(s-&gt;s)) 相同
  • Character.toUpperCase 返回字符。我假设由于s.substring而将其转换为字符串?
  • 非常简单的解决方案。
  • 如果你有org.apache.commons.lang3.StringUtils,那么map调用就变得更简单了map(StringUtils::capitalize)
【解决方案2】:

您需要在 map() 的方法中返回新字符串 - x 是输入值,您必须提供映射值:

    String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
    System.out.println(Arrays.stream(strArray)
            .map((String x) -> { return (x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "");})
            .sorted()
            .collect(Collectors.toList()));

短一点:

    String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
    System.out.println(Arrays.stream(strArray)
            .map(x -> x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "")
            .sorted()
            .collect(Collectors.toList()));

【讨论】:

    【解决方案3】:

    您收到上述编译错误是因为您决定为 map 函数使用 lambda 语句块,并决定不包含 return 语句。

    map 函数将T 类型的元素转换为R,因此如果您决定使用lambda 语句块,您需要提供return 语句显式,唯一不需要提供显式返回语句的情况是使用 lambda 表达式

    其他答案显示了如何使用流完成手头的任务。没有流的另一个变体是:

    //copy the array of strings to a list of strings
    List<String> stringList = new ArrayList<>(Arrays.asList(strArray));
    // remove null
    stringList.removeIf(Objects::isNull); 
    // do replacing
    stringList.replaceAll(s -> Character.isUpperCase(s.charAt(0)) ? 
                s : Character.toUpperCase(s.charAt(0))+ s.substring(1));
    // sort the list
    tempList.sort(Comparator.naturalOrder()); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多