Jsonarray ऑब्जेक्ट में ५०००० jsonObject है। मुझे ऑब्जेक्ट बनाने के लिए इस jsonObject को संसाधित करने की आवश्यकता है, फिर मैं इस ऑब्जेक्ट को एक सूची में जोड़ना चाहता हूं। इसमें बहुत समय लग रहा है इसलिए मैं वस्तु बनाने और सूची में तेजी से जोड़ने के लिए समांतर धारा का उपयोग करना चाहता हूं।

यहाँ वह कोड है जिसे मैं समानांतर लूप से बदलना चाहता हूँ

        // I want to insert object in this array
        List<Curriculum> curriculamList = new ArrayList<>();

        // This is the org.json array
        JSONArray jsonarray = new JSONArray(content);

        // This loop I want to replace
        for (int i = 0; i < jsonarray.length(); i++) {
            JSONObject jsonobject = jsonarray.getJSONObject(i);

            // Start of processing
            Program program = programDAO.getProgramDetails(jsonobject.getInt("programId"));
            Batch batch = batchDAO.getBatchDetails(jsonobject.getInt("batchId"), program);
            if(batch.getBatchId() == 0)
                continue;
            Major major = majorDAO.getMajorDetails(jsonobject.getInt("majorId"));
            Course course = courseDAO.getCourseDetails(jsonobject.getString("courseCode"));
            if(course == null)
                continue;
            double credits = jsonobject.getDouble("credits");
            CourseType courseType = courseTypeDAO.getCourseTypeDetails(program, jsonobject.optString("type"));
            int semesterCount = jsonobject.getInt("semester");
            String prereqCourseString = jsonobject.getString("prereq");
            Course alternateCourse = courseDAO.getCourseDetails(jsonobject.getString("alternate"));

            List<Course> prereqCourseList = new ArrayList<>();
            if (prereqCourseString.length() != 0) {
                String[] prereqCourseSplit = prereqCourseString.split("AND");
                for (String prereqCourseSplitString : prereqCourseSplit) {
                    prereqCourseList.add(courseDAO.getCourseDetails(prereqCourseSplitString.trim()));
                }
            }
            List<Course> prereqChainCourseList = new ArrayList<>();
            // End of processing

            // This is the object
            Curriculum curriculum = new Curriculum(course, credits, courseType, semesterCount, prereqCourseList, prereqChainCourseList, alternateCourse, batch, major);

            // Pushing object into the list
            curriculamList.add(curriculum);
        }

यहां मैंने कुछ कोड की कोशिश की लेकिन हो सकता है कि मैं गलत रास्ते पर हूं। मैं स्ट्रीम के अंदर सूची का उपयोग कैसे कर सकता हूं और लूप की अनुक्रमणिका संख्या प्राप्त कर सकता हूं। कृपया मदद करें कि मैं इसे स्ट्रीम में कैसे परिवर्तित कर सकता हूं।

        JSONArray jsonarray = new JSONArray(content);
        Stream.of(jsonarray)
                .parallel()
                .forEach(objects -> {
                    // How I can get index number here and push it to the list?
                    JSONObject jsonobject = objects.getJSONObject(i);

                    // Here is the processing code

                    Curriculum curriculum = new Curriculum(course, credits, courseType, semesterCount, prereqCourseList, prereqChainCourseList, alternateCourse, batch, major);

                    // Variable used in lambda expression should be final or effectively final? How to add then?
                    curriculamList.add(curriculum);
                });

मैं जावा में नया हूँ कृपया मुझे माफ़ कर दो अगर मैंने कोई गलती की है।

1
Jon Doe 22 मई 2019, 18:35

1 उत्तर

सबसे बढ़िया उत्तर

Stream.of(jsonarray) एक तत्व के साथ एक स्ट्रीम लौटाता है, JSONArray ऑब्जेक्ट, जो आप नहीं चाहते हैं।

मुझे लगता है कि आप यही करने जा रहे हैं:

List<Curriculum> curriculumList = IntStream.range(0, jsonarray.length()).parallel()
            .mapToObj(i -> {
                JSONObject jsonobject = jsonarray.getJSONObject(i);

                // fetch the various parts...

                return new Curriculum(course, credits, courseType, semesterCount, prereqCourseList, prereqChainCourseList, alternateCourse, batch, major);
            }).collect(Collectors.toList());

हालांकि, ऐसा लगता है कि आपका कोड कई अवरुद्ध नेटवर्क कॉल कर रहा है। समानांतर में अवरुद्ध नेटवर्क कॉल को निष्पादित करने के लिए समानांतर धाराओं का उपयोग करना अक्सर अनुचित होता है, क्योंकि समानांतर धाराएं CPU समानांतरकरण के लिए अभिप्रेत हैं, इसलिए एकल साझा थ्रेडपूल का उपयोग करें जिसमें केवल थोड़ी संख्या में थ्रेड्स हों। इसलिए आप कुछ इस तरह पसंद कर सकते हैं:

ExecutorService executor = Executors.newFixedThreadPool(10);

// start many calls running in parallel
List<Future<Curriculum>> futures = IntStream.range(0, jsonarray.length())
        .mapToObj(i -> executor.submit(() -> {
                JSONObject jsonobject = jsonarray.getJSONObject(i);

                // fetch the various parts...

                return new Curriculum(course, credits, courseType, semesterCount, prereqCourseList, prereqChainCourseList, alternateCourse, batch, major);
            })).collect(Collectors.toList());

executor.shutdown();

List<Curriculum> curriculumList = new ArrayList<>();
for (Future<Curriculum> future : futures) {
    curriculumList.add(future.get());
}
5
MikeFHay 14 जिंदा 2020, 12:10