【问题标题】:Lambda Expression to reverse a string - Java用于反转字符串的 Lambda 表达式 - Java
【发布时间】:2025-12-27 14:05:15
【问题描述】:
String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
                  "Jupiter", "Saturn", "Uranus", "Neptune" };

我有一个简单的行星名称数组,我想反转添加到数组中的每个名称(不是字符串顺序)。
我继续与 lambda 语法作斗争:

Arrays.sort(planets, (first, second) -> new StringBuilder(first).reverse().toString());
System.out.println(Arrays.toString(planets));

目前我得到:

这一行有多个标记

  • StringBuilder 类型中的方法reverse() 不适用于参数(String)
  • 类型不匹配:无法从String 转换为int

回复:

谢谢大家的建议... asList 让我很接近。我仍然没有正确排序。

所以我需要找到一种方法让 array.sort 工作,因为这是分配(接受 array.sort 和 lambda 它)。

我已经 ping 导师要求澄清,但我的时间不多了。

这是我尝试保留 array.sort 的工作

            // lambda expression , long to short
        System.out.println("5) Sorted by length (descending):");
        Arrays.sort(planets, (first, second) -> second.length() - first.length());
        System.out.println(Arrays.toString(planets));   

        // lambda expression , reverse the name , then sort in ascending order
        // hint use  new StringBuilder(first).reverse().toString() to reverse the string
        System.out.println("6) Sorted in dictionary order of the reversed name (ascending)");
        Arrays.sort(planets, (first, second) -> new StringBuilder(first).reverse().toString().compareTo(second));
        System.out.println(Arrays.toString(planets));

        // lambda expression , reverse the name , then sort in descending order
        System.out.println("7) Sorted in dictionary order of the reversed name (descending)");
        Arrays.sort(planets, (first, second) -> new StringBuilder(second).reverse().toString().compareTo(first));
        System.out.println(Arrays.toString(planets));

我一生无法弄清楚的是,所有 3 个表达式都得到完全相同的结果......每个表达式都给了我从最长到最短排序的原始数组。

这是我的结果:

5) 按长度排序(降序): [海王星、水星、木星、天王星、土星、金星、地球、火星]

6) 按倒序名的字典顺序排序(升序) [海王星、水星、木星、天王星、土星、金星、地球、火星]

7) 按倒序名的字典顺序排序(降序) [海王星、水星、木星、天王星、土星、金星、地球、火星]

【问题讨论】:

  • 你为什么打电话给Arrays.sort()
  • 我正在使用 Arrays.sort() 因为我被要求做家庭作业。

标签: java arrays lambda java-8


【解决方案1】:

Arrays.sort 需要一个比较器作为第二个参数。它可以使用 lambda 表达式来实现,该表达式将两个字符串作为参数(在您的情况下)并返回一个整数(这是Comparator 接口中定义的 SAM 的要求)。

(first, second) -> new StringBuilder(first).reverse().toString()

是一个接受两个字符串的lambda表达式(类型由编译器推断),但它返回一个字符串而不是整数,因此错误:

java: incompatible types: cannot infer type-variable(s) T
    (argument mismatch; bad return type in lambda expression
      java.lang.String cannot be converted to int)

我有一个简单的行星名称数组,我想颠倒每个名称 被添加到数组中

在这种情况下,您可以简单地使用Arrays.setAll 来修改数组:

Arrays.setAll(planets, i -> new StringBuilder(planets[i]).reverse().toString());

【讨论】:

  • 这是我的代码:Arrays.setAll(planets, i -> new StringBuilder(planets[i]).reverse().toString());但我得到以下尝试:方法 setAll(String[], ( i) -> {}) is undefined for type Arrays
【解决方案2】:

不使用 Stream API 并就地更新字符串的替代解决方案:

Arrays.asList(planets).replaceAll(s -> new StringBuilder(s).reverse().toString());

演示:

String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars", 
        "Jupiter", "Saturn", "Uranus", "Neptune" };
Arrays.asList(planets).replaceAll(s -> new StringBuilder(s).reverse().toString());
System.out.println(Arrays.toString(planets));
// [yrucreM, suneV, htraE, sraM, retipuJ, nrutaS, sunarU, enutpeN]

【讨论】:

  • replaceAll().. 嗯有趣的方法.. +1 :)
【解决方案3】:

这将为您解决:

public static void main(String[] args) {
    String[] arr = {"earth", "mars", "mercury"};
    List<String> ll = Arrays.stream(arr).map(s -> new StringBuilder(s).reverse().toString()).collect(Collectors.toList());
    System.out.println(ll);
}

O/P:

[htrae, sram, yrucrem]

或者如果你只是想打印,使用这个:

String[] arr = {"earth", "mars", "mercury"};
Arrays.stream(arr).map(s -> new StringBuilder(s).reverse().toString()).forEach(System.out::println);

O/P:

htrae
sram
yrucrem

【讨论】:

  • 如果您要直接使用链式forEach 打印结果,您可以省略.toString() 调用...