2017-03-17 7 views
3

私はfor loopを使用してJSONArrayの要素を反復処理する次のコードを持っています。私は、同じタスクを実行するためにstreams APIforEachようJava 8の新機能を使用するにはどうすればよいjava 8で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; 
     } 
    } 

。事前に感謝

+2

JSONArrayのために使用しているライブラリのインポートを投稿していないので、 –

+0

@DmitryZvoryginは質問 –

答えて

6

これは、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); 
} 
+0

に関連するインポートを追加しました。このメソッドを使ってdistinct()を使うにはどうしたらいいですか? JSONObjectは、equalsよりも似たようなものを使って比較するだけのようです... – Myoch

関連する問題