Java,使用parallelStream()比较字符串。anyMatch()和contains()一个版本有效另一个版本无效';T

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)

我的目标是重做这里的代码: 但这证明是不成功的。 我从这里得到了一个想法:

我的想法奏效了,但我怀疑这是一个糟糕的代码,我想知道为什么我所做的StackOverflow返工没有按预期工作

我将在一个块中呈现两位代码。只需在工作版本和非工作版本之间切换注释和未注释的“if”行

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
语句的样式,以消除它们之间的无关差异,但根本不改变行为(使您的问题在“最小的、可复制的示例”中满足“最小的”)。