版權聲明:本文爲博主原創文章,無需授權即可轉載,甚至無需保留以上版權聲明,轉載時請務必註明作者。
https://blog.csdn.net/weixin_43453386/article/details/106419374
一、簡介
操作 | 方法 |
---|---|
拼接 | joining() |
集合 | toList() toSet() toMap() toCollection() |
映射 | mapping() map() |
分組 | groupingBy() partitioningBy() |
計算 | sum() max() min() average() reducing() summingInt() sum() |
過濾 | filter() |
消費 | peek() |
排序 | sorted() |
匹配 | anyMatch() allMatch() noneMatch() |
二、示例
import lombok.Data;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Function;
import java.util.stream.Collectors;
public class StreamTest {
//對象集合
public static List<User> userList = Arrays.asList(
new User(1, "張三", 12, "女"),
new User(2, "李四", 21, "男"),
new User(3, "王五", 32, "男"),
new User(4, "王五", 32, "男"));
//字符串集合
public static List<String> strList = Arrays.asList("a1", "b1", "a2");
//數字集合
public static List<Integer> intList = Arrays.asList(1, 2, 3,3,4);
public static void main(String[] args) {
//拼接的字符
String delimiter = " , ";
String prefix = "Start--";
String suffix = "--End";
System.out.println("默認拼接:"+ strList.stream() .collect(Collectors.joining()));
System.out.println("逗號拼接:"+String.join(delimiter, strList));
System.out.println("逗號拼接:"+strList.stream() .collect(Collectors.joining(delimiter)));
System.out.println("逗號拼接:"+userList.stream().map(e->e.getName()).collect(Collectors.joining(delimiter)));
System.out.println("開頭、中間、結尾,都拼接:"+strList.stream() .collect(Collectors.joining(delimiter, prefix, suffix)));
System.out.println("/******************************************************************************************************/");
System.out.println("把所有的User的name,放入List<String>:"+userList.stream().map(User::getName).collect(Collectors.toList()));
System.out.println("把所有的User的name,去重,放入List<String>:"+userList.stream().map(User::getName).distinct().collect(Collectors.toList()));
System.out.println("/******************************************************************************************************/");
//set自動去重,沒有順序
System.out.println("把所有的User的name,放入Set<String>:"+ userList.stream().map(User::getName).collect(Collectors.toSet()));
System.out.println("/******************************************************************************************************/");
/**
* 要求:key爲id,value爲User
* 注意:toMap時,一定要注意key是否重複,當前key不重複
* 結果:{1=User(id=1, name=張三, age=12, sex=女), 2=User(id=2, name=李四, age=21, sex=男), 3=User(id=3, name=王五, age=32, sex=男), 4=User(id=4, name=王五, age=32, sex=男)}
* 異常:如果key重複,就會報錯java.lang.IllegalStateException: Duplicate key
*/
System.out.println("key爲id,value爲User,當前key不重複:"+userList.stream().collect(Collectors.toMap(User::getId, Function.identity())));
System.out.println("key爲id,value爲User,當前key不重複:"+userList.stream().collect(Collectors.toMap(User::getId, user->user)));
System.out.println("key爲(id+sex),value爲name,當前key不重複:"+userList.stream().collect(Collectors.toMap(e->e.getId().toString().concat("-").concat(e.getSex()), e->e.getName())));
System.out.println("key爲id,value爲(name+sex),當前key不重複:"+userList.stream().collect(Collectors.toMap(e->e.getId().toString(), e->e.getName().toString().concat("-").concat(e.getSex()))));
System.out.println("key爲name,value爲User,當前key重複,value以第1個爲準:"+userList.stream().collect(Collectors.toMap(User::getName,Function.identity(),(t1, t2) -> t1)));
System.out.println("key爲name,value爲User,當前key重複,value以第2個爲準:"+userList.stream().collect(Collectors.toMap(User::getName,Function.identity(),(t1, t2) -> t2)));
System.out.println("/******************************************************************************************************/");
System.out.println("用LinkedList收集:"+intList.stream().collect(Collectors.toCollection(LinkedList::new)).toString());
System.out.println("用CopyOnWriteArrayList收集:"+intList.stream().collect(Collectors.toCollection(CopyOnWriteArrayList::new)).toString());
System.out.println("用TreeSet收集:"+intList.stream().collect(Collectors.toCollection(TreeSet::new)).toString());
System.out.println("/******************************************************************************************************/");
/**
* 要求:按name分組,key爲name,value爲List<User>
* 結果:
key:李四
value:[User(id=2, name=李四, age=21, sex=男)]
key:張三
value:[User(id=1, name=張三, age=12, sex=女)]
key:王五
value:[User(id=3, name=王五, age=32, sex=男), User(id=4, name=王五, age=32, sex=男)]
*/
Map<String, List<User>> map = userList.stream().collect(Collectors.groupingBy(User::getName));
map.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));
System.out.println("/******************************************************************************************************/");
/**
* 要求:按sex分組,key爲sex,value爲Set<String>
* 結果:
key:女
value:[張三]
key:男
value:[李四, 王五]
*/
Map<String, Set<String>> map1 = userList.stream().collect(Collectors.groupingBy(User::getSex,
Collectors.collectingAndThen(
Collectors.toMap(
e -> e,
e -> e.getName()
),
e -> e.values()
.stream()
.collect(Collectors.toSet())
)));
map1.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));
System.out.println("/******************************************************************************************************/");
/**
* 要求:按name分組,value.key爲id,value.value爲name
* 注意:key是否重複,當前key不重複
* 結果:
key:李四
value:{2=李四}
key:張三
value:{1=張三}
key:王五
value:{3=王五, 4=王五}
*/
Map<String, Map<Integer, String>> map2 = userList.stream().collect(Collectors.groupingBy(User::getName,Collectors.toMap(User::getId, User::getName)));
map2.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));
System.out.println("/******************************************************************************************************/");
/**
* 要求:按name分組,value.key爲id,value.value爲(name+sex)
* 注意:key是否重複,當前key不重複
* 結果:
key:李四
value:{2=李四-男}
key:張三
value:{1=張三-女}
key:王五
value:{3=王五-男, 4=王五-男}
*/
Map<String, Map<Integer, String>> map3 = userList.stream().collect(Collectors.groupingBy(User::getName,Collectors.toMap(User::getId, e->e.getName().concat("-").concat(e.getSex()))));
map3.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));
System.out.println("/******************************************************************************************************/");
/**
* 要求:按name分組,value.key爲id,value.value爲(name+sex)
* 注意:key是否重複,當前key重複,以第1個爲準
* 結果:
key:李四
value:{2=李四-男}
key:張三
value:{1=張三-女}
key:王五
value:{3=王五-男, 4=王五-男}
*/
Map<String, Map<Integer, String>> map4 = userList.stream().collect(Collectors.groupingBy(User::getName,Collectors.toMap(User::getId, e->e.getName().concat("-").concat(e.getSex()),(e1,e2)->e1)));
map4.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));
System.out.println("/******************************************************************************************************/");
/**
* 要求:按sex分組,把同一組的name用逗號分割
* 結果:
key:女
value:張三
key:男
value:王五,李四,王五
*/
Map<String, String> map5 = userList.stream() .collect(
Collectors.groupingBy(
User::getSex,
Collectors.collectingAndThen(
Collectors.toMap(
e -> e,
e -> e.getName()
),
e -> e.values()
.stream()
.collect(Collectors.joining(","))
)
));
map5.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));
System.out.println("/******************************************************************************************************/");
/**
* 要求:按奇偶數分組
* 結果:
key:false
value:[1, 3, 3]
key:true
value:[2, 4]
*/
Map<Boolean, List<Integer>> map6 = intList.stream().collect(Collectors.groupingBy(item -> item % 2 == 0));
map6.entrySet().forEach(e-> System.out.println("key:"+e.getKey()+"\n"+"value:"+e.getValue()));
System.out.println("/******************************************************************************************************/");
System.out.println("最大值:"+intList.stream().collect(Collectors.collectingAndThen(Collectors.maxBy((a, b) -> a - b), Optional::get)).toString());
System.out.println("/******************************************************************************************************/");
System.out.println("最小值:"+ intList.stream().collect(Collectors.collectingAndThen(Collectors.minBy((a, b) -> a - b), Optional::get)).toString());
System.out.println("/******************************************************************************************************/");
System.out.println("平均值:"+ intList.stream().collect(Collectors.averagingDouble(item -> item)));
System.out.println("/******************************************************************************************************/");
System.out.println("求和一:"+userList.stream().collect(Collectors.summingInt(item -> item.getAge())));
System.out.println("求和二:"+userList.stream().map(User::getAge).reduce(0,Integer::sum));
System.out.println("求和三:"+userList.stream().mapToInt(User::getAge).sum());
System.out.println("/******************************************************************************************************/");
System.out.println("在每個name前面加上符號,再用逗號拼接:"+userList.stream().collect(Collectors.mapping(e -> "【".concat(e.getName()).concat("】"), Collectors.joining(","))));
System.out.println("/******************************************************************************************************/");
Map<String, IntSummaryStatistics> collect = userList.stream().collect(Collectors.groupingBy(User::getSex, Collectors.summarizingInt(User::getAge)));
IntSummaryStatistics statistics1 = collect.get("男");
IntSummaryStatistics statistics2 = collect.get("女");
System.out.println("【統計】和:"+statistics1.getSum()+","+"平均值:"+statistics1.getAverage()+","+"最大值:"+statistics1.getMax()+","+"最小值:"+statistics1.getMin()+","+"平均值:"+statistics1.getAverage()+","+"計數:"+statistics1.getCount());
System.out.println("【統計】和:"+statistics2.getSum()+","+"平均值:"+statistics2.getAverage()+","+"最大值:"+statistics2.getMax()+","+"最小值:"+statistics2.getMin()+","+"平均值:"+statistics2.getAverage()+","+"計數:"+statistics2.getCount());
System.out.println("/******************************************************************************************************/");
/**
* intList:[1, 2, 3, 3, 4]
* sum :是每次累計計算的結果
* b :Function的結果,也就是 x+1 的結果
* 結果 :18
* 過程 :
0+2
2+3
5+4
9+4
13+5
*/
System.out.println("累計計算:"+intList.stream().collect(Collectors.reducing(0, x -> x + 1, (sum, b) -> {
System.out.println(sum + "+" + b);
return sum + b;
})));
// 下面代碼是對reducing函數功能實現的描述,用於理解reducing的功能
int sum = 0;
for (Integer item : intList) {
int b = item + 1;
System.out.println(sum + "+" + b);
sum = sum + b;
}
System.out.println("累計計算:"+sum);
System.out.println("/******************************************************************************************************/");
System.out.println("過濾age>=21:"+userList.stream().filter(a -> a.getAge()>=21).map(e->e.getName()).collect(Collectors.toList()));
System.out.println("過濾sex==男:"+userList.stream().filter(a -> "男".equals(a.getSex())).map(e->e.getName()).collect(Collectors.toList()));
System.out.println("/******************************************************************************************************/");
/**
* 要求:每個User的age,都擴大10位
* 結果:
1,張三,old age:12
1,張三,new age:120
User(id=1, name=張三, age=120, sex=女)
*/
userList.stream().peek(e->{
System.out.println(e.getId() +","+e.getName()+","+"old age:"+e.getAge());
e.setAge(e.getAge()*10);
System.out.println(e.getId() +","+e.getName()+","+"new age:"+e.getAge());
}).forEach(System.out::println);
System.out.println("/******************************************************************************************************/");
System.out.println("默認按照自然順序進行排序:"+intList.stream().sorted().collect(Collectors.toList()));
System.out.println("按照降序順序進行排序:"+intList.stream().sorted((a,b)->b.compareTo(a)).collect(Collectors.toList()));
System.out.println("/******************************************************************************************************/");
System.out.println("集合中是否任一元素匹配以'a'開頭:"+strList.stream().anyMatch((s) -> s.startsWith("a")));
System.out.println("集合中是否所有元素匹配以'a'開頭:"+strList.stream().allMatch((s) -> s.startsWith("a")));
System.out.println("集合中是否沒有元素匹配以'd'開頭:"+strList.stream().noneMatch((s) -> s.startsWith("a")));
}
}
@Data
class User{
public Integer id;
public String name;
public Integer age;
public String sex;
public User(Integer id, String name, Integer age,String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
}