在java中使用.stream()比较整数

在java中使用.stream()比较整数,java,integer,compare,java-8,java-stream,Java,Integer,Compare,Java 8,Java Stream,我有一个ArrayList和另一个来自控制台的int。 我想使用stream()查找比列表中的int更大的最接近的数字。 这不起作用的原因: Scanner scn = new Scanner(System.in); int numOfRows = scn.nextInt(); int nextNumber = scn.nextInt(); for (int i = 0; i < numOfRows; i++) { String[] input = scn.nextLine().s

我有一个ArrayList和另一个来自控制台的int。 我想使用stream()查找比列表中的int更大的最接近的数字。 这不起作用的原因:

Scanner scn = new Scanner(System.in);
int numOfRows = scn.nextInt();
int nextNumber = scn.nextInt();
for (int i = 0; i < numOfRows; i++) {
    String[] input = scn.nextLine().split(" ");
    ArrayList<Integer> nums = new ArrayList<>();
    for (int j = 0; j < input.length; j++) {
        nums.add(Integer.parseInt(input[j]));
    }
    nextNumber = nums.stream().filter(x -> x > nextNumber).findFirst();
    System.out.println(nextNumber); 
}
Scanner scn=新扫描仪(System.in);
int numorrows=scn.nextInt();
int-nextNumber=scn.nextInt();
for(int i=0;ix>nextNumber.findFirst();
System.out.println(下一个编号);
}

如果要查找大于某个界限的最小数字:

private int smallestLargerThan(int x, List<Integer> list) {
    return list.stream().filter(n -> n > x).mapToInt(n -> n).min();
}
private int smallestLargerThan(int x,List){
return list.stream().filter(n->n>x).mapToInt(n->n).min();
}
.filter(n->n>x)
删除所有小于或等于
x
的值

.mapToInt(n->n)
转换为
IntStream
,这是下一个操作所必需的:

.min()
返回
IntStream
中的最小元素。因为此时的流只包含大于x的值,所以返回的元素就是您要查找的数字


您发布的代码将无法编译,因为
.findFirst()
返回一个
可选的
,而不是
整数。这在语义上也是错误的,因为第一个元素不一定是最小的,因为
未排序

您眼前的问题很容易解决:

Optional<Integer> oi = nums.stream()
                           .filter(x -> x > nextNumber)
                           .findFirst();
System.out.println(oi.isPresent()? "Found: "+oi.get() : "Not found");

优点是,您永远不会涉及
ArrayList
,也不需要在任何步骤自动装箱整数,而且您实际上检索到满足条件的最小数字,而不是第一个。

您忘记告诉我们编译器错误消息(此代码不编译)。您需要对筛选列表进行排序或对其应用最小()操作。findFirst()不是最接近的数字,而是比nextNumber大的第一个数字。然后还可以保存数组创建:
Pattern.compile(“”).splitAsStream(scn.nextLine()).mapToInt(Integer::parseInt).
是的,很好。如果OP确实需要
findFirst()
语义,那么它甚至可以简化正则表达式的求值。
OptionalInt oi = Stream.of(scn.nextLine().split(" "))
                       .mapToInt(Integer::parseInt)
                       .filter(i -> i > nextNumber)
                       .min();
System.out.println(oi.isPresent()? "Found: "+oi.getAsInt() : "Not found");