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