我需要从stdin中读取整数列表并将它们转换为java.awt.Point(x,y)数组。
输入格式为x y x y x y ...
我可以像这样非流式地进行,
Scanner scanner = new Scanner(System.in).useDelimiter("\n");
String[] input = scanner.next().split("\\s+");
Point[] points = new Point[input.length/2];
for (int i = 0; i < input.length/2; i++) {
points[i] = new Point(Integer.parseInt(input[2*i]),
Integer.parseInt(input[2*i+1]));
}
但是我如何使用流呢?我被卡在map()
。
List<Point> points = Arrays.stream(scanner.next().split("\\s+"))
.map(Integer::parseInt).map(??).collect(Collectors.toList());
提前致谢。
答案 0 :(得分:4)
由于您希望在每个步骤中从流中获取两个项目,并且由于您事先不知道流中的内容,因此您可以分两步完成:
Scanner scanner = new Scanner(System.in).useDelimiter("\n");
List<Integer> integers = Arrays.stream(scanner.next().split("\\s+"))
.map(Integer::valueOf)
.collect(Collectors.toList());
List<Point> points = IntStream.range(1, integers.size())
.filter(x -> x % 2 == 1) // in order to not repeat elements
.mapToObj((i) -> new Point(integers.get(i-1), integers.get(i)))
.collect(Collectors.toList());
System.out.println(points);
<强>输出强>
1 2 3 4 5 6 7 8
[java.awt.Point[x=1,y=2], java.awt.Point[x=3,y=4], java.awt.Point[x=5,y=6], java.awt.Point[x=7,y=8]]