Java,使用parallelStream()比较字符串。anyMatch()和contains()一个版本有效另一个版本无效';T
我的目标是重做这里的代码: 但这证明是不成功的。 我从这里得到了一个想法: 我的想法奏效了,但我怀疑这是一个糟糕的代码,我想知道为什么我所做的StackOverflow返工没有按预期工作 我将在一个块中呈现两位代码。只需在工作版本和非工作版本之间切换注释和未注释的“if”行Java,使用parallelStream()比较字符串。anyMatch()和contains()一个版本有效另一个版本无效';T,java,java-stream,Java,Java Stream,我的目标是重做这里的代码: 但这证明是不成功的。 我从这里得到了一个想法: 我的想法奏效了,但我怀疑这是一个糟糕的代码,我想知道为什么我所做的StackOverflow返工没有按预期工作 我将在一个块中呈现两位代码。只需在工作版本和非工作版本之间切换注释和未注释的“if”行 import java.util.Arrays; import java.util.List; public class Demo { public static void main(String[] args)
import java.util.Arrays;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> result0 = Arrays.asList("/Videos/Templates/file.mp4", "/Videos/Templates/file2.mp4", "/Videos/Templates/file3.mp4");
List<String> result2 = Arrays.asList("/Videos/Templates/file.mp4.sha256");
for (int i = 0; i < result0.size(); i++) {
List<String> finalResult = result0;
int finalI = i;
// if (result2.parallelStream().anyMatch(x -> x.contains(finalResult.get(finalI)))) {
if (result2.parallelStream().anyMatch(finalResult.get(finalI)::contains)){
System.out.println("sha matches files: " + result0.get(i));
}
}
}
}
导入java.util.array;
导入java.util.List;
公开课演示{
公共静态void main(字符串[]args){
List result0=Arrays.asList(“/Videos/Templates/file.mp4”、“/Videos/Templates/file2.mp4”、“/Videos/Templates/file3.mp4”);
List result2=Arrays.asList(“/Videos/Templates/file.mp4.sha256”);
对于(int i=0;ix.contains(finalResult.get(finalI))){
if(result2.parallelStream().anyMatch(finalResult.get(finalI)::contains)){
System.out.println(“sha匹配文件:+result0.get(i));
}
}
}
}
如果它证明这个问题更适合作为更好地解释代码的注释,那么我很乐意修改它。因为
包含
不是交换运算符。例如,“lightning”包含“light”,但“light”不包含“lightning”。在您的情况下,“/Videos/Templates/file.mp4.sha256”
包含“/Videos/Templates/file.mp4”
,但“/Videos/Templates/file.mp4”
不包含“/Videos/Templates/file.mp4.sha256”
(如果不清楚,
foo::bar
相当于x->foo.bar(x)
,因此finalResult.get(finalI)::contains
相当于x->finalResult.get(finalI).contains(x),因为contains
不是交换运算符。例如,“lightning”包含“light”,而是“light”不包含“lightning”。在您的示例中,“/Videos/Templates/file.mp4.sha256”
包含“/Videos/Templates/file.mp4”
,但“/Videos/Templates/file.mp4.sha256”
不包含“/Videos/Templates/file.mp4.sha256”
(如果不清楚,foo::bar
相当于x->foo.bar(x)
,因此finalResult.get(finalI)::contains
相当于x->finalResult.get(finalI).contains(x)
)@Joseph说得对!您刚刚颠倒了方法对象和操作数的顺序。将对result2
流的字符串调用String.contains
方法
此外,您不需要使用任何for
循环来计算此结果,两个列表都可以转换为流,从而避免在同一方法上混合不必要的命令式和反应式样式
以下是您的程序的仅限Streams版本:
import java.util.Arrays;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> result0 = Arrays.asList("/Videos/Templates/file.mp4", "/Videos/Templates/file2.mp4", "/Videos/Templates/file3.mp4");
List<String> result2 = Arrays.asList("/Videos/Templates/file.mp4.sha256");
result0.parallelStream()
.filter(item0 -> result2.parallelStream()
.anyMatch(item2 -> item2.contains(item0)))
.forEach(item0 -> System.out.println("sha matches files: " + item0));
}
}
导入java.util.array;
导入java.util.List;
公开课演示{
公共静态void main(字符串[]args){
List result0=Arrays.asList(“/Videos/Templates/file.mp4”、“/Videos/Templates/file2.mp4”、“/Videos/Templates/file3.mp4”);
List result2=Arrays.asList(“/Videos/Templates/file.mp4.sha256”);
result0.parallelStream()
.filter(item0->result2.parallelStream()
.anyMatch(item2->item2.contains(item0)))
.forEach(item0->System.out.println(“sha匹配文件:+item0”);
}
}
@Joseph说得对!您刚刚颠倒了方法对象和操作数的顺序。将对result2
流的字符串调用String.contains
方法
此外,您不需要使用任何for
循环来计算此结果,两个列表都可以转换为流,从而避免在同一方法上混合不必要的命令式和反应式样式
以下是您的程序的仅限Streams版本:
import java.util.Arrays;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> result0 = Arrays.asList("/Videos/Templates/file.mp4", "/Videos/Templates/file2.mp4", "/Videos/Templates/file3.mp4");
List<String> result2 = Arrays.asList("/Videos/Templates/file.mp4.sha256");
result0.parallelStream()
.filter(item0 -> result2.parallelStream()
.anyMatch(item2 -> item2.contains(item0)))
.forEach(item0 -> System.out.println("sha matches files: " + item0));
}
}
导入java.util.array;
导入java.util.List;
公开课演示{
公共静态void main(字符串[]args){
List result0=Arrays.asList(“/Videos/Templates/file.mp4”、“/Videos/Templates/file2.mp4”、“/Videos/Templates/file3.mp4”);
List result2=Arrays.asList(“/Videos/Templates/file.mp4.sha256”);
result0.parallelStream()
.filter(item0->result2.parallelStream()
.anyMatch(item2->item2.contains(item0)))
.forEach(item0->System.out.println(“sha匹配文件:+item0”);
}
}
我稍微编辑了你的问题的代码。除了添加导入以使其编译(使你的问题在“最小、可复制的示例”中满足“可复制”),我调整了两个if
语句的样式,以消除它们之间的无关差异,尽管根本不改变行为(为了让你的问题在“最小的,可复制的例子”中满足“最小的”)。我稍微编辑了你问题的代码。除了添加导入以使其编译(为了让你的问题在“最小的,可复制的例子”中满足“可复制的”),我调整了两个if
语句的样式,以消除它们之间的无关差异,但根本不改变行为(使您的问题在“最小的、可复制的示例”中满足“最小的”)。