如何将整数流转换为java.awt.Point?

时间:2017-08-26 04:10:14

标签: lambda java-8 java-stream

我需要从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());

提前致谢。

1 个答案:

答案 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]]