繁体   English   中英

在 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 上调用 forEach 会导致 java.lang.IllegalStateException

[英]Calling forEach on a stream causes java.lang.IllegalStateException

我有一个执行以下操作的程序:

  1. 在 Main 方法中存储文件名

  2. 将该文件从 Main 传递给下面的方法(StreamParser)

  3. 方法 StreamParser 将该文件读取为 Stream

  4. StreamParser 应该返回 Stream

  5. 在 main 方法中,当我在 purchaseEventStream 上调用 forEach 时,它会出现错误

    purchaseEventStream.forEach(purchaseEvent -> {

Exception in thread "main" java.lang.IllegalStateException: source already consumed or 
    closed
    at java.base/java.util.stream.AbstractPipeline.sourceSpliterator(AbstractPipeline.java:409)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at com.cognitree.internship.streamprocessing.Main.main(Main.java:22)

流解析器 Class

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class StreamParser {

public Stream<PurchaseEvent> parser(String fileName) throws IOException {
    Stream<PurchaseEvent> purchaseEventStream;
    try (Stream<String> lines = Files.lines(Paths.get(fileName))) {
        purchaseEventStream= lines.map(line -> {
            String[] fields = line.split(",");
            PurchaseEvent finalPurchaseEvent = new PurchaseEvent();
            finalPurchaseEvent.setSessionId(fields[0]);
            finalPurchaseEvent.setTimeStamp(fields[1]);
            finalPurchaseEvent.setItemId(fields[2]);
            finalPurchaseEvent.setPrice(fields[3]);
            finalPurchaseEvent.setQuantity(fields[4]);
            return finalPurchaseEvent;
        });
        return purchaseEventStream;
    }
}
}

主Class

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Main {
public static void main(String[] args) throws IOException {
    OutputStreamWriter outputStream = new OutputStreamWriter(new 
    FileOutputStream("output1.txt"));
    String file = "/Users/mohit/intern-mohit/yoochoose-buys.dat";
    StreamParser streamParser = new StreamParser();
    List<ReportGenerator> reports = new ArrayList<>();
    PurchaseEventCount purchaseEventCount = new PurchaseEventCount();
    QuantityPerSession quantityPerSession = new QuantityPerSession();
    SessionCount sessionCount = new SessionCount();
    reports.add(purchaseEventCount);
    reports.add(sessionCount);
    reports.add(quantityPerSession);
    Stream<PurchaseEvent> purchaseEventStream = streamParser.parser(file);
    purchaseEventStream.forEach(purchaseEvent -> {
        for (ReportGenerator report : reports) {
            report.generateReports(purchaseEvent);
        }
    });
    reports.forEach(report -> {
        try {
            report.printReports(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
}
}

为什么我会收到错误消息?

java 中的 stream 不是集合。 它不存储数据。 您应该从 class StreamParser中的方法parser()创建并返回一个集合,然后从返回的集合中创建一个 stream。

我重写了您的StreamParser class 以返回List

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;

public class StreamParser {

    public List<PurchaseEvent> parser(String fileName) throws IOException {
        List<PurchaseEvent> purchaseEventStream = Files.lines(Paths.get(fileName))
                                                       .map(line -> {
                                                           String[] fields = line.split(",");
                                                           PurchaseEvent finalPurchaseEvent = new PurchaseEvent();
                                                           finalPurchaseEvent.setSessionId(fields[0]);
                                                           finalPurchaseEvent.setTimeStamp(fields[1]);
                                                           finalPurchaseEvent.setItemId(fields[2]);
                                                           finalPurchaseEvent.setPrice(fields[3]);
                                                           finalPurchaseEvent.setQuantity(fields[4]);
                                                           return finalPurchaseEvent;
                                                       })
                                                       .collect(Collectors.toList());
        return purchaseEventStream;
    }
}

我相应地更改了您的Main class。

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter outputStream = new OutputStreamWriter(new FileOutputStream("output1.txt"));
        String file = "/Users/mohit/intern-mohit/yoochoose-buys.dat";
        StreamParser streamParser = new StreamParser();
        List<ReportGenerator> reports = new ArrayList<>();
        PurchaseEventCount purchaseEventCount = new PurchaseEventCount();
        QuantityPerSession quantityPerSession = new QuantityPerSession();
        SessionCount sessionCount = new SessionCount();
        reports.add(purchaseEventCount);
        reports.add(sessionCount);
        reports.add(quantityPerSession);
        List<PurchaseEvent> purchaseEventStream = streamParser.parser(file);
        purchaseEventStream.forEach(purchaseEvent -> {
            for (ReportGenerator report : reports) {
                report.generateReports(purchaseEvent);
            }
        });
        reports.forEach(report -> {
            try {
                report.printReports(outputStream);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM