Java 为什么这个未使用的流会对结果产生影响?
为什么以下有效未使用的行(在方法中:getAllDefinedVars)会对最终结果产生影响:Java 为什么这个未使用的流会对结果产生影响?,java,java-8,java-stream,Java,Java 8,Java Stream,为什么以下有效未使用的行(在方法中:getAllDefinedVars)会对最终结果产生影响: List collect=allVars.stream().filter(v->false).collect(Collectors.toList()) 如果我删除整个方法和调用此方法的一行代码(GenerateOneSetoBools中的第一行),我最终会得到另一个结果。 我期待这样的行为如果 上述行对列表allVars或任何其他变量有影响 将使用流的结果 就我所知,这一切都没有发生。因此,删除整个方
List collect=allVars.stream().filter(v->false).collect(Collectors.toList())强> 如果我删除整个方法和调用此方法的一行代码(GenerateOneSetoBools中的第一行),我最终会得到另一个结果。
我期待这样的行为如果
public class PairwiseMain {
private static PairwisePermutator pp = new PairwisePermutator();
public static void main(String[] args) {
for(int i = 0; i < 20; i++) {
pp.permutate(i);
System.out.println("----------------");
}
}
}
没有流:仅删除GenerateOneSetofool()中的第一行
两个输出都不同,例如,最后一行,您得到的结果的差异与行无关
List collect=allVars.stream().filter(v->false.collector(Collectors.toList())代码>。问题是你的算法是不确定的。我已获取了您的代码,并针对相同的输入多次运行它:
for(int i = 0; i < 20; i++) {
pp.permutate(5);
System.out.println("----------------");
}
我没有逐行检查你的代码,所以我不确定,但我猜你的一些集合不能保证元素的顺序
然而,有趣的是,当我多次运行main
时,不同版本的输出的显示顺序总是相同的(或者至少在我尝试的5次中)。更重要的是,当您提到的那一行被删除时,顺序就改变了——但在调用main之间保持不变。当我们加上在不同的机器上它的行为不同这一事实时,我的结论是它可能与程序在内存中的放置方式有关。您得到的结果的差异与行List collect=allVars.stream().filter(v->false).collect(collector.toList())无关代码>。问题是你的算法是不确定的。我已获取了您的代码,并针对相同的输入多次运行它:
for(int i = 0; i < 20; i++) {
pp.permutate(5);
System.out.println("----------------");
}
我没有逐行检查你的代码,所以我不确定,但我猜你的一些集合不能保证元素的顺序
然而,有趣的是,当我多次运行main
时,不同版本的输出的显示顺序总是相同的(或者至少在我尝试的5次中)。更重要的是,当您提到的那一行被删除时,顺序就改变了——但在调用main之间保持不变。当我们加上在不同的机器上它的行为不同这一事实时,我的结论是它可能与程序在内存中的放置方式有关。filter(v->false)
意味着get返回一个空列表,忽略listYes的所有数据,但是这个列表从未被使用过,并且所有变量都保持不变。所以你声称allVars.stream().filter(v->false).collect(Collectors.toList())
更改了allVars
的元素?我理解正确吗?这对他们有什么影响?我对这个问题有点困惑。我只是运行了代码,得到了相同的结果。也许你在做别的事情?作为旁注,因为我看到了这个奇怪的System.out.println(Arrays.toString(vars.toArray())代码>在不同的帖子中多次出现,你能告诉我它来自哪里吗?有没有一些书、教程或类似的东西使用并推荐这种结构?我的意思是,当我想打印vars
时,首先想到的是System.out.println(vars)代码>,但一定有一个原因,为什么这么多人认为最好先将整个集合复制到数组中,然后再使用另一个实用方法,现在只需要获得相同的字符串输出。filter(v->false)
意味着返回一个空列表,忽略listYes的所有数据,但是这个列表从未被使用过,并且所有变量都保持不变。所以你声称allVars.stream().filter(v->false).collect(Collectors.toList())
更改了allVars
的元素?我理解正确吗?这对他们有什么影响?我对这个问题有点困惑。我只是运行了代码,得到了相同的结果。也许你在做别的事情?作为旁注,因为我看到了这个奇怪的System.out.println(Arrays.toString(vars.toArray())代码>在不同的帖子中多次出现,你能告诉我它来自哪里吗?有没有一些书、教程或类似的东西使用并推荐这种结构?我的意思是,当我想打印vars
时,首先想到的是System.out.println(vars)代码>,但很多人认为最好先将整个集合复制到一个数组中,然后再使用另一个实用程序方法(现在变得非常必要),以获得相同的字符串输出,这肯定是有原因的。
[true, true, true, true, true]
[false, false, false, true, false]
[false, false, false, false, true]
[true, true, true, false, false]
[false, true, true, true, false]
[true, false, true, true, false]
[true, true, false, false, false]
for(int i = 0; i < 20; i++) {
pp.permutate(5);
System.out.println("----------------");
}
[true, true, true, true, true]
[false, false, false, true, false]
[false, false, false, false, true]
[true, true, true, false, false]
[true, false, false, true, false]
[false, false, true, true, false]
[true, true, true, false, false]
----------------
[true, true, true, true, true]
[false, false, false, true, false]
[false, false, false, false, true]
[true, true, true, false, false]
[false, true, true, true, false]
[true, false, true, true, false]
[true, true, false, false, false]