从Stream <integer>填充对象字段

时间:2017-11-03 15:53:11

标签: java stream java-stream

我有课

@Data
Test{
  private int[] a;
  private int[] b;
}

我私有Stream<Integer> stream有1 000 000个整数。

如何进行以下操作:

  1. 遍历流中的所有整数
  2. 创建新测试
  3. 如果i!=0i添加到test.a,则将i添加到test.b
  4. 最后我需要一个带有2个数组的Test对象,其中a包含所有非零元素,b包含全零。

    我需要1个测试对象。<​​/ p>

3 个答案:

答案 0 :(得分:1)

也许您可以使用2个流操作,并在1个测试实例上使用set和a。b。

public class Foo {

    public static void main(String[] args) throws IOException {

        List<Integer> myList = new ArrayList<>();
        myList.add(1);
        myList.add(0);
        myList.add(1);
        Test t = new Test();
        t.setA(myList.stream().filter(x -> x != 0).mapToInt(x -> x).toArray());
        t.setB(myList.stream().filter(x -> x == 0).mapToInt(x -> x).toArray());
        System.out.println("t: " + t);

    }

}

class Test {
    private int[] a;
    private int[] b;

    public void setA(int[] array) {
        a = array;
    }

    public void setB(int[] array) {
        b = array;
    }

    @Override
    public String toString() {
        return "Test {a=" + Arrays.toString(a) + ", b=" + Arrays.toString(b) + "}";
    }

}

答案 1 :(得分:1)

如果您事先知道您有1,000,000个整数,则根本不需要收集零:

int[] a = stream.mapToInt(Integer::intValue).filter(i -> i!=0).toArray();
int[] b = new int[1_000_000 - a.length];
Test test = new Test(a, b);

答案 2 :(得分:0)

以下是将Stream拆分为两个Streams的示例实现

public class Main {

static class Test {
    private int[] a;
    private int[] b;

    Test(int[] a, int[] b) {
        this.a = a;
        this.b = b;
    }
}

public static void main(String[] args) {
    IntStream.Builder zeroStreamBuilder = IntStream.builder();
    IntStream.Builder nonZeroStreamBuilder = IntStream.builder();

    IntStream intStream = IntStream.of(0, 0, 1, 2, 3, 4);
    intStream.forEach(value -> {
        if (value == 0)
            zeroStreamBuilder.add(value);
        else
            nonZeroStreamBuilder.add(value);
        }
    );

    int[] a = zeroStreamBuilder.build().toArray();
    int[] b = nonZeroStreamBuilder.build().toArray();
    Test result = new Test(a, b);
}
}

如果您愿意使用List,则可以跳过从流.build().toArray()构建数组,因为您可以直接将值添加到结果列表中。