Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8Lambdas-如何在填充之前有条件地重置变量_Java_Json_Lambda - Fatal编程技术网

Java8Lambdas-如何在填充之前有条件地重置变量

Java8Lambdas-如何在填充之前有条件地重置变量,java,json,lambda,Java,Json,Lambda,我试图使用Java中的lambda来填充基于lambda内部派生条件的JSONArray,基本上如果满足条件x,我需要清除JSONArray并重置值,否则将值附加到JSONArray。然而,鉴于lambdas所需的有效最终变量,这似乎是不可能的-任何能够提供建议的人,下面是我的尝试,它给了我“变量应为最终或有效最终”的信息: 假设您使用的是JSONArray 将数组设置为final,而不是用新的数组实例替换它,只需在添加新项之前清除它即可 final JSONObject myObject =

我试图使用Java中的lambda来填充基于lambda内部派生条件的
JSONArray
,基本上如果满足条件x,我需要清除
JSONArray
并重置值,否则将值附加到
JSONArray
。然而,鉴于lambdas所需的有效最终变量,这似乎是不可能的-任何能够提供建议的人,下面是我的尝试,它给了我“变量应为最终或有效最终”的信息:

假设您使用的是
JSONArray

将数组设置为final,而不是用新的数组实例替换它,只需在添加新项之前清除它即可

final JSONObject myObject = paramObj.getJSONObject(X);
final JSONArray myArray = myObject.getJSONArray(VALUE);
if (myArray != null)
{
    myList.forEach(code -> {
        if (myCondition.equalsIgnoreCase(TEST))
        {
            while(myArray.length() > 0)
            {
                myArray.remove(0);
            } 
            myArray.put(code);
        }
        else
        {
            myArray.put(code);
        }
    });
}

清除数组是一种选择,但是如果确实需要创建新对象,则可以使用此方法

您可以定义某种类型的“Carrier”对象,将其设置为final,然后将JSONArray放入其中。在最简单的情况下,JSONArray数组(也可以是一个列表或包含对JSONArray引用的自定义对象)例如:


为什么不使用简单的foreach呢?(带有稍微清理过的代码)


避免不必要地使用remove()和remove可能的O(n)复杂性(取决于它的实现方式)来乱丢代码。

JSONArray来自哪个包?如果JSONArray内部使用ArrayList,此代码将不会从列表中删除所有项。相反,您可能需要的是while(myArray.length()>0){myArray.remove(0);}@digvijay91事实上,我认为它可能会删除所有内容,但随后会溢出。你的版本更安全,所以我在中编辑了它。
final JSONObject myObject = paramObj.getJSONObject(X);
final JSONArray myArray = myObject.getJSONArray(VALUE);
if (myArray != null)
{
    myList.forEach(code -> {
        if (myCondition.equalsIgnoreCase(TEST))
        {
            while(myArray.length() > 0)
            {
                myArray.remove(0);
            } 
            myArray.put(code);
        }
        else
        {
            myArray.put(code);
        }
    });
}
final JSONObject myObject = paramObj.getJSONObject(X);
final JSONArray [] myArray = new JSONArray[]{myObject.getJSONArray(VALUE)};
if (myArray[0] != null)
{
    myList.forEach(code -> {
        if (myCondition.equalsIgnoreCase(TEST))
        {
            myArray[0] = new JSONArray();
            myArray[0].put(code);
        }
        else
        {
            myArray[0].put(code);
        }
    });
}
JSONObject myObject = paramObj.getJSONObject(X);
JSONArray myArray = myObject.getJSONArray(VALUE);
if (myArray != null) {
   for (Object code : myList) {
      if (myCondition.equalsIgnoreCase(TEST)) {
         myArray = new JSONArray();  
      }
      myArray.put(code);
   }
}