这是一个使用Stream
和javaslang.control.Validation
的Java 8应用程序,可以对成功/失败场景进行流量控制。我有一个junit测试执行以下操作:
@Autowired
MessageEntityRepository messageEntityRepository;
....
@Test
public void handleTest(){
/* MyEvent is basically a container object used to create
something like HashMap for further processing */
MyEvent event = prepareEvent(asList("Data.json", "Data2.json", "Data_badformat.json"));
InboundResponse<Stream<InboundMessageResponse<MessageSuccess, MessageFailure>>>
fileResponses = inboundService.handle(event);
fileResponses.getResponses().forEach(this::printResults);
assertEquals(3,messageEntityRepository.count());
}
public void printResults(InboundMessageResponse<MessageSuccess, MessageFailure> responses){
System.out.println("HELLO");
}
这是一个使用event
作为容器对象的测试,它将记录收集到H2数据库中。行fileResponses.getResponses().forEach(this::printResults);
最终只是向我的控制台打印“Hello”。该测试的结果是它传递了3个记录插入到我的数据库中。
这里对我来说很奇怪:如果删除行fileResponses.getResponses().forEach(this::printResults);
,则测试失败,显示插入了0条记录。
似乎我需要使用handle方法的输出来使handle方法甚至被执行。
答案 0 :(得分:1)
Streams是懒惰的,除非给出终端操作,否则他们不会执行任何操作。其余的函数管道是要在流上执行的操作列表,而不是显式的执行调用。 forEach
是终端操作,因此当它出现时,您将根据回调获取流值。其他终端操作为collect
或reduce