我想把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()
时也打印相同内容,但如何打印为字符串
5条答案
按热度按时间jmo0nnb31#
在java 8中,有一个方法joining(),它是Collectors class的一部分,你必须使用
Collectors.joining()
来连接这个字符串。下面是代码:
或者
brc7rcf02#
你在找这样的东西吗?
输出:
或者:
输出:
ugmeyewa3#
您误解了Stream API背后的机制。
流管道由源(可能是数组、集合、生成器函数、I/O通道等)、零个或多个中间操作(将流转换为另一个流,如filter( predicate ))和终端操作(产生结果或副作用,如count()或forEach(消费者))组成。
Streams are lazy
;源数据上的computation
是only performed when the terminal operation is initiated
,并且仅在需要时使用源元素。将仅对管道中的数据执行**
if the terminal operation is initiated
**操作。从编译器的Angular 来看,没有终结操作的流是完全有效的。它将被编译,但不会被执行。
您尝试打印的内容(
java.util.Spliterators$1Adapter@63961c42
)不是结果,而是流对象本身。要产生结果或副作用,流管道必须以终端操作结束(
collect()
、reduce()
、count()
、forEach()
、findFirst()
、findAny
、anyMatch()
-已在代码中注解掉)。peek()
是一个中间操作,容易与forEach()
混淆。您可以根据需要多次使用peek()
,这对于调试非常有用。9rnv2umw4#
如果您真的只想打印元素而不想得到它们作为回报,您可以
forEach
也是对流的“终止”操作,这意味着它“实际执行”它。8nuwlpux5#
您需要通过调用collect或reduce来“执行"流