如何判断流是否有一个或多个管道?

how to tell if a stream has one pipeline or more?

我们可以说流连接使用一个流管道吗?例如这段代码

Stream.concat(
    l.stream()
        .filter(x -> x.getCompanyState().startsWith("D"))
        .sorted(Comparator.comparing(Company::getCompanyState)),
    l.stream()
        .filter(x -> !x.getCompanyState().startsWith("D"))
).forEach(System.out::println);

您无法分辨这种差异。连接两个流后,您应该将结果视为一个流,与最初创建为一个流的流没有区别。流从哪里获取其元素始终取决于实现。在您的示例中,很明显流可能从其他两个流中获取其元素,但在某些示例中这远非明确。

如果您的真正问题是您的流是从具有相同元素的流连接而成的,并且您想要删除重复项,distinct() 可以做到这一点。考虑例如:

    List<String> strings = List.of("C", "A");
    Stream<String> concatenated = Stream.concat(
            strings.stream().sorted(),
            strings.stream());
    String joined = concatenated.collect(Collectors.joining());
    System.out.println(joined);

输出有重复:

ACCA

解决方案:将对 distinct() 的调用插入到您的管道中:

    String joined = concatenated.distinct().collect(Collectors.joining());

现在输出没有任何重复项

AC