Java 使用流API创建对象初始化循环

Java 使用流API创建对象初始化循环,java,java-8,java-stream,Java,Java 8,Java Stream,我有一组常量值,可以作为列表使用。使用这些值,我必须创建一个键值对对象,并且必须将该对象添加到列表中。我想用Java8中的流API来实现这一点。下面是使用for循环的示例实现 for (int i=0; i<length; i+=2){ list.add(new sampleObject(constant[i],constant[i+1]); } for(inti=0;i当然可以 IntStream.iterate(0, i -> i < length, i

我有一组常量值,可以作为列表使用。使用这些值,我必须创建一个键值对对象,并且必须将该对象添加到列表中。我想用Java8中的流API来实现这一点。下面是使用for循环的示例实现

for (int i=0; i<length; i+=2){    
    list.add(new sampleObject(constant[i],constant[i+1]);
}
for(inti=0;i当然可以

IntStream.iterate(0, i -> i < length, i -> i + 2)
         .mapToObj(i -> new sampleObject(constant[i], constant[i+1]))
         .collect(Collectors.toList());
IntStream.iterate(0,i->ii+2)
.mapToObj(i->new sampleObject(常数[i],常数[i+1]))
.collect(Collectors.toList());
我不太清楚,但是
constant
可能必须是
final
或实际上是
final
才能编译


注意:我刚刚意识到,这个重载的
iterate
方法是在Java 9中添加的。请查看Java 8解决方案!

IntStream.iterate()
,它通过
IntStream.limit()
生成无限的
IntStream
,使其有限:

List<sampleObject> list = 
    IntStream.iterate(0, i -> i + 2)
              .limit(Math.ceil(length / 2D))
              .mapToObj(i -> new sampleObject(constant[i], constant[i+1]))
              .collect(Collectors.toList());
列表=
迭代(0,i->i+2)
.限值(数学单元(长度/2D))
.mapToObj(i->new sampleObject(常数[i],常数[i+1]))
.collect(Collectors.toList());

如果要从Arrays.stream开始(常量),没有很好的方法来配对这样的流的元素。for循环是最清晰的解决方案imho。limitconstant中的某个地方应该有2的除法,它将是一个数组,该数组的值可以在以后在类中定义,但一旦定义就不会更改。这就足够了吗?@JavaiMaster只要
常量
没有被赋值,那么你就没事了。如果我是你,我会坚持使用for循环;它更直观。@Jacob G。iterate()的第二个参数是
IntUnaryOperator
。我不理解lambda的含义。你能解释一下吗?@davidxxx当然!我使用了接受三个参数的(我刚刚意识到这是在Java 9中添加的)。因为这个问题被标记为
Java-8
,我认为你的答案应该被接受。@Jacob好吧!Java 9中优秀的重载在Java 8中遗漏了:处理奇数长度的
Math.ceil()
非常难看而且容易出错。