大神们,最近在用1.8重构代码 发现遇到了一个问题
例如 有这样的一个集合 List {1,2,3,4,5,6}
本来的代码是这样的
···java
List<Integer> collectList = new ArrayList<>;
for(i = 0;i<list.size();i += 2){
collectList.add( list.get(i) );
}
```java
就是简单的一个遍历,将 原来的集合 List 中 1 , 3 ,5 个元素给收集到新集合 collectList 中
就是这样的一个操作
用Java8 集合流 操作 应该怎么操作呢 (同理的还有 i+=3 ,i+=4)
也就是每隔几个元素 对原来的集合进行数据处理
可能问的确实太简单啦 但是我真的没想到呀 T_T
大神求解0.0
可能是我例子描述的不太清楚
我想拿到 即合理 1,3,5,7位置的元素
例如有 类的实例对象A,B,C,D,E,F
在集合List<E> = {A,B,C,D,E,F}里
用java8流 可以取到 A,C,E 吗
也就是等同于for循环 i+=2的 效果
list.stream().filter(param -> (int)param % 2 == 0).forEach(collectList.add( list.get(i) ));
刚刚看的API,你可以试一下
那如果集合里的元素不是数字呢
比如说是对象a,b,c,d,e
可以通过流取到a,c,e元素吗 也就是1,3,5个元素
类似于for循环里的i+=2 来取元素
@祈求者-: js里面filter可以传进三个参数,类似 coffee.filter((d,i,a)->return i%3==0).forEach(p->collectList.add( p )); 这种用法不知道Java 有没有
@codingHeart: 嗯,我想了一下 自己构造一个返回结果为predicate的方法 作为参数传入filter里应该是可以实现哒,谢谢你啦
1楼的方法可以解决你的问题,但是List里不是int是其它对象的时候就不适用了,
这里还有一种解决办法,可能会复杂一点,但是更加通用,不过也有些不好的地方:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); List<Integer> subList = IntStream.range(0, list.size()) .filter(n -> n % 2 == 0) .mapToObj(list::get) .collect(Collectors.toList());
不好的地方在于,java8 引入stream的目的是为拆分“如何循环做” 和“循环做什么”,说白了就是为了方便并行化,stream和parallelStream,而上面的方法明显是不能达到并行化效果的,
结论是: 只是简单的int数字做这种everyNth操作,没有必要并行;不是简单int数字的操作,又没有办法用parallel,和直接写for循环区别不大。所以我觉得并不一定要将所有的for都改为stream,应该更具实际需求合理使用。