一、stream和for在下列情况的对比
1.1: 显示集合中的每一个元素
List<Integer> idList = new ArrayList(); idList.add(1); idList.add(2);
for(Integer id:idList){System.out.print(id)}
idList.stream().foreach(n -> System.out.print(n));
或者:idList.stream().foreach(System.out::println)
1.2: 过滤集合
List<Integer> result = new ArrayList();
for(Integer id:idList){
if(id != 1){
result.add(id);
}
}
result = idList.stream().filter(id ->{
return !ObjectUtils.equals(id,1);
}).collect(Collectors.toList());
1.3:获取A集合中不在B集合中的元素
List<Integer> result = new ArrayList();
List<Integer> a = new ArrayList(); a.add(1);a.add(2);
List<Integer> b = new ArrayList(); b.add(1);
for(Integer aa:a){
boolean flag = true;
for(Integer bb:b){
if(bb.equals(aa)){
flag = false;
}
}
if(flag){
result.add(aa);
}
}
result = a.stream().foreach(aa ->{
return b.stream().noneMatch(bb ->{
return bb.equals(aa);
});
}).collect(Collectors.toList());
1.4:list转map
for:定义map,循环判断list,得到
stream:Map<Integer,string> map =list.stream().collect(Collectors.toMap(obj:getId,obj:getName));
1.4.1:
Map转list
for:新增一个list,便利map
stream():map.entryset().stream().sorted(Map.Entry.CompatingByKey()).map(e ->new Obj(e.getKey(),e.getValue()) ).collect(Collectors.toList);
1.5:集合的求和
for: for循环,每次取值相加
stream(): integerlist.stream().mapToInt(str -> str).sum();
1.6:集合的最值问题
for:for循环,判断集合中最小和最大值
stream():stList.stream().mapToInt(str -> str).max()/min()
二、stream中map和peek的区别
2.1:对于实体对象的集合而言:
peek: 修改了对象中的属性值,返回的仍是对象集合;无return
List<Student> result = stList.stream().peek(student -> {
student.setName(student.getName() + "1");
}).collect(Collectors.toList());
map:修改了对象中的属性值,返回的仍是属性集合,有return,和实现有关
List<String> result = stList.stream().map(student -> {
return student.getName() +"1";
}).collect(Collectors.toList());
2.2 对于非实体对象的集合而言:
List<Integer> stList = new ArrayList<>(2);
stList.add(1);
stList.add(2);
map:
List<Integer> mapList = stList.stream().map(i -> i).collect(Collectors.toList());
peek:
List<Integer> peekList = stList.stream().peek(i -> {
i = i;
}).collect(Collectors.toList()); ---------------没有区别
三、总结
3.1:stream实现集合的操作代码量少,简洁,for代码量大
3.2 :stream实现集合的操作是并行的(多线程),for是串行的
3.3:stream在数据量大的情况下效率高,for在数据量小的情况下效率高.
网友评论