如何在 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
How to iterate over a JSONArray in java 8
提问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 API或forEach执行相同的任务。提前致谢
采纳答案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);
}

