在 java 中使用 .stream() 比较整数
compare Integers using .stream() in java
我有一个 ArrayList 和另一个来自控制台的整数。
我想使用 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);
}
如果你想找到大于某个界限的最小数字:
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()
returns IntStream
中的最小元素。由于此时的流只包含大于x的值,所以返回的元素就是你要找的数字。
您发布的代码无法编译,因为 .findFirst()
returns 是 Optional<Integer>
,而不是 Integer
。这在语义上也是错误的,因为第一个元素不一定是最小的,因为你的 Stream
是未排序的。
您眼前的问题很容易解决:
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
并且不需要在任何步骤自动装箱整数,你实际上检索 最小的 数字满足标准,而不是第一个标准。
我有一个 ArrayList 和另一个来自控制台的整数。 我想使用 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);
}
如果你想找到大于某个界限的最小数字:
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()
returns IntStream
中的最小元素。由于此时的流只包含大于x的值,所以返回的元素就是你要找的数字。
您发布的代码无法编译,因为 .findFirst()
returns 是 Optional<Integer>
,而不是 Integer
。这在语义上也是错误的,因为第一个元素不一定是最小的,因为你的 Stream
是未排序的。
您眼前的问题很容易解决:
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
并且不需要在任何步骤自动装箱整数,你实际上检索 最小的 数字满足标准,而不是第一个标准。