May*_*tra 0 java java-8 java-stream
想要在下面的代码段中使用Streams API并删除当前for循环:
public List<MyObject> performSomeAction(){
List<String> myList= Arrays.asList("abc","xyz","def");
List<MyObject> resultList=new ArrayList<MyObject>();
int startIndex=0;
int totalNumOfRecords=1000;
for(int i=0;i<totalNumOfRecords;i++){
SomeObject o= xService.doSomething();
String type = o.getType();
int length = o.getLength();
if(myList.contains(type)){
int[] myarray=getMyArray(startIndex+20, startIndex+length);
String id=o.getSomeId();
OtherObject obj= xService.performOperation(myarray,"abcd");
resultList.add(new MyObject(obj,id));
}
startIndex+=length;
}
return resultList;
}
Run Code Online (Sandbox Code Playgroud)
我试过这样的事情:
IntStream.range(0,totalNumOfRecords).forEach(i -> xService.doSomething());
Run Code Online (Sandbox Code Playgroud)
但我陷入困境,没有得到进一步的进展,需要从派生对象'o'中取出多个值,并使用它在它上面执行过滤器再次使另一个方法调用得到一些数组,将其传递给其他方法返回我需要创建resultList的其他对象
这一行:
startIndex+=length;
Run Code Online (Sandbox Code Playgroud)
意味着下一次迭代的行为取决于当前迭代之后的状态.
这基本上意味着迭代必须连续发生.因此,在这里扼杀Streams没有任何好处.
坚持使用现有代码.
我已经看到许多问题,其中OP询问如何重写代码以使用流.隐含的假设是流优于循环,因此流应始终优先于循环使用.
这是不正确的.
与循环相比,流是:
break,continue; 从周围的上下文重新分配局部变量; 抛出检查异常; 从包含方法返回; 循环某些原始类型.但是,流可以是:
流是一种工具,具有有限的好处和许多缺点.重写现有的工作代码以使用它们确实不是一个好主意.