在java8中将“Stream“转换< String>为“String”以合并流中的一组字符串

iq3niunx  于 2023-03-06  发布在  Java
关注(0)|答案(5)|浏览(306)

我想把Stream<String>转换成String并打印所有字符串。

Stream<String> result= Stream.of("do","re","ma","po","fa","si")
                             .filter(str -> str.length()>5)
                             .peek(System.out:: println);
                           //.allMatch(str -> str.length() >5);

System.out.println(result);

这里是我的输出

拆分器$1适配器@63961c42
结果是打印object而不是String,并且在转换为toString()时也打印相同内容,但如何打印为字符串

jmo0nnb3

jmo0nnb31#

在java 8中,有一个方法joining(),它是Collectors class的一部分,你必须使用Collectors.joining()来连接这个字符串。
下面是代码:

String result = Stream.of("do", "re", "ma", "po", "fa", "si")
                .filter(str -> str.length() > 1)
                .collect(Collectors.joining());

或者

String result= Stream.of("do","re","ma","po","fa","si")
                .filter(str -> str.length() > 1)
                .peek(System.out::println)
                .collect(Collectors.joining());
brc7rcf0

brc7rcf02#

你在找这样的东西吗?

String result = Stream.of("do","re","ma","po","fa","si").
                collect(Collectors.joining(""));
    System.out.println(result);

输出:

doremapofasi

或者:

String result = Stream.of("do", "re", "ma", "po", "fa", "si")
            .filter(str -> str.length() > 1)
            .peek(System.out::println)
            .collect(Collectors.joining(""));
        System.out.println(result);

输出:

do
re
ma
po
fa
si
doremapofasi
ugmeyewa

ugmeyewa3#

您误解了Stream API背后的机制。
流管道由(可能是数组、集合、生成器函数、I/O通道等)、零个或多个中间操作(将流转换为另一个流,如filter( predicate ))和终端操作(产生结果或副作用,如count()或forEach(消费者))组成。Streams are lazy;源数据上的computationonly performed when the terminal operation is initiated,并且仅在需要时使用源元素。

    • 主要结论:**

将仅对管道中的数据执行**if the terminal operation is initiated**操作。
从编译器的Angular 来看,没有终结操作的流是完全有效的。它将被编译,但不会被执行。
您尝试打印的内容(java.util.Spliterators$1Adapter@63961c42)不是结果,而是流对象本身。
要产生结果或副作用,流管道必须以终端操作结束(collect()reduce()count()forEach()findFirst()findAnyanyMatch()-已在代码中注解掉)。peek()是一个中间操作,容易与forEach()混淆。您可以根据需要多次使用peek(),这对于调试非常有用。

public static void main(String[] args) {

        String result = getStream()
                .filter(str -> str.length() > 5 && str.length() < 8)
                .findFirst() // that will produce a single result that may or may not be present
                .orElseThrow(); // action for the case if result is not present

        System.out.println("Single result: " + result + "\n");

        getStream()
                .filter(str -> str.contains("a"))
                .peek(System.out::println) // intermediate operation that will print every element that matches the first filter
                .filter(str -> str.length() > 8)
                .forEach(System.out::println); // terminal operation that prints every element remained after processing the pipeline
    }

    private static Stream<String> getStream() {
        return Stream.of("Ignoranti", "quem", "portum", "petat", "nullus", "suus", "ventus", "est");
    }
    • 输出**
Single result: portum

Ignoranti
Ignoranti
petat
9rnv2umw

9rnv2umw4#

如果您真的只想打印元素而不想得到它们作为回报,您可以

Stream.of("do","re","ma","po","fa","si")
    .filter(str -> str.length()>5)
    .forEach(System.out:: println);

forEach也是对流的“终止”操作,这意味着它“实际执行”它。

8nuwlpux

8nuwlpux5#

您需要通过调用collect或reduce来“执行"流

assertEquals("ab", Arrays.stream(new String[]{"a", "b"}).reduce("", (s,x) -> s + x));

相关问题