如何使用Lambda和Streams在Java 8中反转单个字符串?

Ani*_*edi 6 java lambda java-stream

我有一个字符串说"Aniruddh",我想在Java 8中使用lambda和流来反转它.我该怎么做?

Hol*_*ger 23

给出一个字符串

String str = "Aniruddh";
Run Code Online (Sandbox Code Playgroud)

规范的解决方案是

String reversed = new StringBuilder(str).reverse().toString();
Run Code Online (Sandbox Code Playgroud)

如果,为了教育目的,你想通过流式传输字符串的字符来解决这个问题,你可以这样做

String reversed = str.chars()
    .mapToObj(c -> (char)c)
    .reduce("", (s,c) -> c+s, (s1,s2) -> s2+s1);
Run Code Online (Sandbox Code Playgroud)

这不仅复杂得多,而且还存在许多性能缺陷.

以下解决方案消除了拳击相关的开销

String reversed = str.chars()
    .collect(StringBuilder::new, (b,c) -> b.insert(0,(char)c), (b1,b2) -> b1.insert(0, b2))
    .toString();
Run Code Online (Sandbox Code Playgroud)

但由于插入基于数组的缓冲区的开头意味着复制以前收集的所有数据,因此效率仍然较低.

因此,对于实际应用而言,最重要的是保持开头所示的规范解决方案.


Vis*_*hnu 6

尝试使用 lambda 和流反转字符串

import java.util.stream.Stream;
import java.util.stream.Collectors;

    public class Test  {


        public static void main(String[] args) {

            System.out.println(reverse("Anirudh"));;
        }
        public static String reverse(String string) {
            return Stream.of(string)
                .map(word->new StringBuilder(word).reverse())
                .collect(Collectors.joining(" "));
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 有点证明@satya 的观点......在这种情况下,当`new StringBuilder(word).reverse()` 提供所需的效果时,我们真的需要使用流或 lamdas 吗?恕我直言,这是过度设计的 (12认同)