首页新闻找找看学习计划

关于java8 steam流操作的一个问题

0
悬赏园豆:50 [已解决问题] 解决于 2017-07-31 11:56

大神们,最近在用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的 效果

祈求者-的主页 祈求者- | 初学一级 | 园豆:154
提问于:2017-07-28 17:01
< >
分享
最佳答案
0

list.stream().filter(param -> (int)param % 2 == 0).forEach(collectList.add( list.get(i) ));  

刚刚看的API,你可以试一下

收获园豆:30
codingHeart | 小虾三级 |园豆:1511 | 2017-07-28 18:43

那如果集合里的元素不是数字呢 

比如说是对象a,b,c,d,e

可以通过流取到a,c,e元素吗 也就是1,3,5个元素

类似于for循环里的i+=2 来取元素

祈求者- | 园豆:154 (初学一级) | 2017-07-28 19:44

@祈求者-: js里面filter可以传进三个参数,类似 coffee.filter((d,i,a)->return i%3==0).forEach(p->collectList.add( p ));  这种用法不知道Java 有没有

codingHeart | 园豆:1511 (小虾三级) | 2017-07-31 09:28

@codingHeart: 嗯,我想了一下 自己构造一个返回结果为predicate的方法 作为参数传入filter里应该是可以实现哒,谢谢你啦

祈求者- | 园豆:154 (初学一级) | 2017-07-31 11:55
其他回答(1)
0

 

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,应该更具实际需求合理使用。

 

 

 

 

收获园豆:20
苍枫露雨 | 园豆:1027 (小虾三级) | 2017-07-28 19:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册