我用不同的方法实现了相同的功能,有人能告诉我为什么我的最后一个功能不打印假吗?

Cri*_*ica 2 java lambda java-stream

public static void main(String[] args) {         
  System.out.println(hasPairWithSum(new int[] { 12, 4, 3, 4, 1, 7 }, 9));        
  System.out.println(hasPairWithSum2(new int[] { 12, 4, 3, 4, 1, 7 }, 9));       
  System.out.println(hasPairWithSum3(new int[] { 12, 4, 3, 4, 1, 7 }, 9));  
}

public static boolean hasPairWithSum(int[] intArray, int sum) {         
  int len = intArray.length;        
  for (int i = 0; i < len - 1; i++) {
        for (int j = i + 1; j < len; j++) {
                if (intArray[i] + intArray[j] == sum) {
                    return true;
                }
        }
  }         
  return false;
}

public static boolean hasPairWithSum2(int[] intArray, int sum) {         
    HashSet<Integer> mySet = new HashSet<Integer>();
    int len = intArray.length;
    for (int i = 0; i < len; i++) {
        if (mySet.contains(intArray[i])) {
                return true;
        }
        mySet.add(sum - intArray[i]);
    }
    return false;
}

public static boolean hasPairWithSum3(int[] intArray, int sum) {         
    HashSet<Integer> mySet = new HashSet<Integer>();
    int len = intArray.length;
    return IntStream.range(0, len).mapToObj(i -> {
        if (mySet.contains(intArray[i])) {
                return true;
        }
        mySet.add(sum - intArray[i]);
        return false;
    }) != null;
}
Run Code Online (Sandbox Code Playgroud)

Max*_*pov 6

流在 Java 中是惰性的。您需要调用终端操作来开始评估流

"< U > Stream< U > mapToObj(IntFunction< ? extends U > mapper)" 不是终端操作,它总是返回 Stream< Boolean > 对象,并且它总是不为空。

您可以像这样修改代码,但我不确定这是使用流的好习惯:

public static boolean hasPairWithSum3(int[] intArray, int sum) {         
    HashSet<Integer> mySet = new HashSet<Integer>();
    int len = intArray.length;
    return IntStream.range(0, len).anyMatch(i -> {
        if (mySet.contains(intArray[i])) {
                return true;
        }
        mySet.add(sum - intArray[i]);
        return false;
    });
}
Run Code Online (Sandbox Code Playgroud)