我在这篇文章中遇到了一些聪明的代码,用于将Iterator转换为来自Karol的Stream .我必须承认,我不完全理解如何Iterable在以下代码中将lambda分配给该类型...
static <T> Stream<T> iteratorToFiniteStream(final Iterator<T> iterator) {
final Iterable<T> iterable = () -> iterator;
return StreamSupport.stream(iterable.spliterator(), false);
}
Run Code Online (Sandbox Code Playgroud)
我决定编写自己的小测试以确保它编译和执行,并且确实如此.
public void printsStream_givenIterator()
{
Iterator<String> iterator = Arrays.asList("a", "b", "c").iterator();
final Iterable<String> iterable = () -> iterator;
StreamSupport.stream(iterable.spliterator(), false).forEach(s -> System.out.println(s));
}
// prints: abc
Run Code Online (Sandbox Code Playgroud)
我的理解是lambda () -> iterator充当供应商的职能.
Iterable不是FunctionalInterface,那么如何为它分配这个lambda?
Hy,我有一个(非常)大的XML文件(100GB)和一个foo列表,我想将它转换成一个流,就像它们引入对象的java 8一样:
任何lib或代码示例的想法?
在开始时:
<foos>
<foo>...</foo>
<foo>...</foo>
</foos>
Run Code Online (Sandbox Code Playgroud)
在末尾:
Stream<Foo> foosStream = ????("foo.xml")
streamFoos.forEach(foo->foo.doFooStuffs());
Run Code Online (Sandbox Code Playgroud)
编辑:@Pierre谢谢,这是您的解决方案的实现:
try {
XMLEventReader reader = XMLInputFactory.newInstance().
createXMLEventReader(stream);
final Unmarshaller unmarshaller = JAXBContext.newInstance(XXXXX.class).createUnmarshaller();
Iterator<XXXXX> it = new XmlIterator<>(reader, unmarshaller, "xxxxxx");
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.ORDERED), false);
} catch (XMLStreamException e1) {
logger.error("XMLStreamException", e1);
} catch (JAXBException e) {
logger.error("JAXBException", e);
}
Run Code Online (Sandbox Code Playgroud)
和
public class XmlIterator<T> implements Iterator<T> {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
XMLEventReader reader;
XMLEvent event;
Unmarshaller unmarshaller;
String name;
public XmlIterator(XMLEventReader reader, Unmarshaller unmarshaller, String …Run Code Online (Sandbox Code Playgroud)