如何在 Java 8 中迭代 JSONArray

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/42854505/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 00:28:06  来源:igfitidea点击:

How to iterate over a JSONArray in java 8

javajsonforeachjava-8java-stream

提问by Kasun Siyambalapitiya

I have the following code which is using a for loopto iterate over the elements in a JSONArray.

我有以下代码,它使用 afor loop来迭代a中的元素JSONArray

import org.apache.log4j.Logger;
import org.json.JSONArray;
import org.json.JSONObject;

import java.util.stream.IntStream;
    public class Pmt {
    private String[] patchInformation_svnRevisionpublic;
    private final Logger logger = Logger.getLogger(Pmt.class.getName());

        private static final String COMMITS_IN_PATCH_IDENTIFIER = "patchInformation_svnRevisionpublic";  //key used to identify the commits in a patch from JSON response received from PMT
        private static final String KEY_STRING = "name";
        private static final String VALUE_STRING = "value";

         public String[] getPublicGitCommitHashes(JSONArray jsonArray) {

            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = (JSONObject) jsonArray.get(i);
                String tempName = (String) jsonObject.get(KEY_STRING);
                if (tempName.equals(COMMITS_IN_PATCH_IDENTIFIER)) {
                    JSONArray tempCommitsJSONArray = (JSONArray) jsonObject.get(VALUE_STRING);
                    //initializing the patchInformation_svnRevisionpublic array
                    patchInformation_svnRevisionpublic = new String[tempCommitsJSONArray.length()];
                    // for ommiting the white spaces at the begingin and end of the commits
                    IntStream.range(0, tempCommitsJSONArray.length()).forEach(j -> patchInformation_svnRevisionpublic[j] = ((String) tempCommitsJSONArray.get(j)).trim());

                    logger.info(" The commits hashes obtained from WSO2 PMT are successfully saved to an array");

                    System.out.println("The commit Ids are");
                    //            for printing all the commits ID associated with a patch
                    IntStream.range(0, patchInformation_svnRevisionpublic.length).mapToObj(i1 -> patchInformation_svnRevisionpublic[i1]).forEach(System.out::println);
                    System.out.println();
                    break;
                }
            }
            //to prevent from internaal representation by returning referecnce to mutable object
            String clonedPatchInformation_svnRevisionpublic[] = patchInformation_svnRevisionpublic.clone();
            return clonedPatchInformation_svnRevisionpublic;
        }
    }

How do I use the new features in Java 8like streams APIor forEachto perform the same task. Thanks in advance

我如何使用Java 8like 中的新功能streams APIforEach执行相同的任务。提前致谢

采纳答案by Dmitry Zvorygin

This is equivalent of or code in Java 8 stream API. Not 100% equivalent, but you can get the main idea.

这相当于 Java 8 流 API 中的 或 代码。不是 100% 等效,但您可以了解主要思想。

private static final String COMMITS_IN_PATCH_IDENTIFIER = "patchInformation_svnRevisionpublic";  //key used to identify the commits in a patch from JSON response received from PMT
private static final String KEY_STRING = "name";
private static final String VALUE_STRING = "value";

public List<String> getCommitIds (JSONArray array) {
     return arrayToStream(array)
            .map(JSONObject.class::cast)
            .filter(o -> o.get(KEY_STRING).equals(COMMITS_IN_PATCH_IDENTIFIER))
            .findFirst()
            .map(o -> (JSONArray) o.get(VALUE_STRING))
            .map(Main::arrayToStream)
            .map(commits ->
                    commits.map(Object::toString)
                            .map(String::trim)
                            .collect(Collectors.toList())
            )
            .orElseGet(Collections::emptyList);
}

@Nonnull
private static Stream<Object> arrayToStream(JSONArray array) {
    return StreamSupport.stream(array.spliterator(), false);
}