Java流Api—是否可以保留原始的map()输入?

Java流Api—是否可以保留原始的map()输入?,java,java-8,java-stream,Java,Java 8,Java Stream,我理解映射操作不会保持状态,但在某些情况下这可能会有所帮助,例如: List<String> somePageLinks = ... //populate the list //crawl those pages somePageLinks.stream().map( link -> CrawlerFactory.getCrawler( link ). forEach( crawler.getContent( link ); 问

我理解映射操作不会保持状态,但在某些情况下这可能会有所帮助,例如:

List<String> somePageLinks = ... //populate the list

//crawl those pages
somePageLinks.stream().map( link -> CrawlerFactory.getCrawler( link ).
                       forEach( crawler.getContent( link );
问题是forEach不再提供链接。有什么办法克服这个问题吗

谢谢

一种方法是将链接存储在CrawlerFactory.getCrawler link创建的实例中,这样就不必再次将链接传递给crawler.getContent

另一种方法是让map生成某种类型的Pair对象,该对象包含CrawlerFactory.getCrawler链接返回的链接和实例。这将使链接和爬虫程序在forEach方法中都可用。

一种方法是将链接存储在CrawlerFactory.getCrawler link创建的实例中,这样您就不必再次将链接传递给crawler.getContent


另一种方法是让map生成某种类型的Pair对象,该对象包含CrawlerFactory.getCrawler链接返回的链接和实例。这将使链接和爬虫程序在forEach方法中都可用。

好的,当然我可以省略地图

somePageLinks.stream().forEach( link -> {
                CrawlerFactory.getCrawler( link ).getContent( link );
            });

好的,当然我可以省略地图

somePageLinks.stream().forEach( link -> {
                CrawlerFactory.getCrawler( link ).getContent( link );
            });

您可能希望在流上签出.peek方法,它与forEach一样接受使用者,但保持流不变。因此,您可以在.map之前使用.peek

myStream.peek(link -> consume(link)).map(link -> transform(link));

您可能希望在流上签出.peek方法,它与forEach一样接受使用者,但保持流不变。因此,您可以在.map之前使用.peek

myStream.peek(link -> consume(link)).map(link -> transform(link));

您可能想质疑您的设计。为什么工厂需要链接来创建爬虫,然后再次需要链接来获取内容?要么在工厂中不需要它,要么在getContent方法中不需要它。如果可能的话,它将简单为maplink->CrawlerFactory.getCrawler.getContentlink;或者maplink->CrawlerFactory.getCrawlerlink.getContentYep,也可以。我希望爬虫程序是无状态的,但我们可以质疑这一点。你可能想质疑你的设计。为什么工厂需要链接来创建爬虫,然后再次需要链接来获取内容?要么在工厂中不需要它,要么在getContent方法中不需要它。如果可能的话,它将简单为maplink->CrawlerFactory.getCrawler.getContentlink;或者maplink->CrawlerFactory.getCrawlerlink.getContentYep,也可以。我希望爬虫是无状态的,但我们可以质疑这一点。。