如何判断流是否有一个或多个管道?
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
我们可以说流连接使用一个流管道吗?例如这段代码
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