使用Java 8流生成整数对

Bar*_*une 5 java lambda java-8 java-stream

我正在尝试生成整数对-我有一个Pair类,其构造函数采用2个整数。以下代码有效,但看起来很笨拙-特别是使用mapToObj(Integer :: new)从intStream到对象流的转换。

private static List<Pair> success() {
    return IntStream.range(0, 10).
            mapToObj(Integer::new).flatMap(i -> IntStream.range(12, 15).
                mapToObj(j -> new Pair(i, j))).
            collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

首先,有人能做到这一点吗?

其次,当我重构为将某些流提取为变量时,出现错误:IllegalStateException:流已被操作或关闭。这是重构的方法-有人知道这是否是代码问题吗?

static List<Pair> fail() {
    Stream<Integer> outer = IntStream.range(0, 10).mapToObj(Integer::new);
    IntStream inner = IntStream.range(12, 15);
    Stream<Pair> pairStream = outer.flatMap(i -> 
            inner.mapToObj(j -> new Pair(i, j)));
    return pairStream.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*rey 1

为什么不使用普通for循环?普通for循环将:

  1. 看起来更好看
  2. 明确你的意图

static List<Pair> fail() {
    List<Pair> pairs = new ArrayList<>(30);

    for (int i = 0; i < 10; i++) {
        for (int j = 12; j < 15; j++) {
            pairs.add(new Pair(i, j));
        }
    }

    return pairs;
}
Run Code Online (Sandbox Code Playgroud)