繁体   English   中英

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

[英]compare Integers using .stream() in java

我有一个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); 
}

您当前的问题很难解决:

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

但是,如果您想编写代码来最佳地计算所需的代码,则这不是正确的方法。 更好的选择是:

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");

这样做的好处是,您永远不会涉及到ArrayList ,也不需要在任何步骤自动对整数进行装箱,并且实际上会检索满足条件的最小数字,而不是一个。

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

private int smallestLargerThan(int x, List<Integer> list) {
    return list.stream().filter(n -> n > x).mapToInt(n -> n).min();
}

.filter(n -> n > x)丢弃所有小于或等于x

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

.min()返回IntStream的最小元素。 由于此时流仅包含大于x的值,因此返回的元素是您要查找的数字。

您发布的代码无法编译,因为.findFirst()返回Optional<Integer> ,而不是Integer 从语义上来说也是错误的,因为当Stream未排序时,第一个元素不一定是最小的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM