java8使用函数结果改变进一步处理

时间:2018-02-19 13:43:53

标签: java validation lambda

这是一个使用Streamjavaslang.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方法甚至被执行。

1 个答案:

答案 0 :(得分:1)

Streams是懒惰的,除非给出终端操作,否则他们不会执行任何操作。其余的函数管道是要在流上执行的操作列表,而不是显式的执行调用。 forEach是终端操作,因此当它出现时,您将根据回调获取流值。其他终端操作为collectreduce