我有课
@Data
Test{
private int[] a;
private int[] b;
}
我私有Stream<Integer> stream
有1 000 000个整数。
如何进行以下操作:
i!=0
将i
添加到test.a
,则将i
添加到test.b
最后我需要一个带有2个数组的Test对象,其中a包含所有非零元素,b包含全零。
我需要1个测试对象。</ p>
答案 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()
构建数组,因为您可以直接将值添加到结果列表中。