概述
Stream流是java8的新特性,結合lambada運算式結合使用可以提升的開發的效率和性能,
作用
1、用于對集合迭代的增強處理
2、可以對集合陣列進行更高效的聚合操作,比如分組、過濾等
3、解決了傳統開發程序中,jdk對集合操作的不足
模擬資料
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
private Integer age;
}
//=================================================
ArrayList<User> list = new ArrayList<>();
list.add(new User(1, "小王", 20));
list.add(new User(4, "小龍", 21));
list.add(new User(3, "小湯", 29));
list.add(new User(2, "小吳", 18));
排序(根據id)
List<User> userList = list.stream().sorted(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o1.getId() - o2.getId();
}
}).collect(Collectors.toList());
userList.forEach(System.out::println);
結果
User(id=1, name=小王, age=20)
User(id=2, name=小吳, age=18)
User(id=3, name=小湯, age=19)
User(id=4, name=小龍, age=21)
Process finished with exit code 0
過濾(找到滿足的條件)
//單條件過濾
List<User> userList = list.stream().filter(res -> res.getId().equals(1)).collect(Collectors.toList());
userList.forEach(System.out::println);
//多條件過濾
List<User> userList = list.stream().filter(res -> {
return res.getName().equals("小王") && res.getAge().equals(20);
}).collect(Collectors.toList());
userList.forEach(System.out::println);
結果
User(id=1, name=小王, age=20)
map(改變集合元素中的資訊)
//直接回傳修改的屬性
List<String> userList = list.stream().map(res -> res.getName().concat("_qiandu")).collect(Collectors.toList());
userList.forEach(System.out::println);
//======================================================
小王_qiandu
小龍_qiandu
小湯_qiandu
小吳_qiandu
另一種
List<User> userList = list.stream().map(res -> {
res.setName(res.getName() + "_qiandu");
return res;
}).collect(Collectors.toList());
userList.forEach(System.out::println);
結果
User(id=1, name=小王_qiandu, age=20)
User(id=4, name=小龍_qiandu, age=21)
User(id=3, name=小湯_qiandu, age=19)
User(id=2, name=小吳_qiandu, age=18)
這種在javascript中常用
var arr=[
{id:1,name:"qqqq"},
{id:2,name:"qqqq"},
{id:3,name:"qqqq"}
];
var new_arr = arr.map(datd=>{
data.age = 1;
return data;
})
// new_arr
{id:1,name:"qqqq",age:1},
{id:2,name:"qqqq",age:1},
{id:3,name:"qqqq",age:1}
獲取總數、遍歷、去重
// 獲取總數
long count = list.stream().count();
int size = list.size();
//遍歷,與js用法相同
list.stream().forEach(res -> {
System.out.println(res);
});
userList.forEach(System.out::println);
//去重元素,如果集合為物件 需要hashcode相同 equals為true才能成功
list.stream().distinct().collect(Collectors.toList());
求某一屬性最大(小)與map(總和)
//求最大
Optional<User> optionalUser = list.stream().max(new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o1.getAge() - o2.getAge();
}
});
//判斷是否存在值
if (optionalUser.isPresent()) {
System.out.println(optionalUser.get());
}
//=====================================================
//求集合某一屬性總和
Integer totalAge = list.stream().map(res -> {
return res.getAge(); //這里回傳值,總的回傳就是啥
}).reduce(0, (c1, c2) -> c1 + c2);
System.out.println(totalAge);
在這些之中,map是比較難以使用的,他能改變回傳值的形態,這些方法可以通過鏈式編程層層回傳,
舉個栗子 :用戶登錄的回傳值會回傳密碼這些敏感資料,我們可以使用map對其處理,
List<User> userList = list.stream().map(user -> {
user.setPassWord("");
return user; //這里回傳的是啥,管道流回傳的就是啥
}).collect(Collectors.toList());
userList.forEach(System.out::println);
結果
User(id=1, name=小王, passWord=)
User(id=4, name=小龍, passWord=)
User(id=3, name=小湯, passWord=)
User(id=2, name=小吳, passWord=)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/317465.html
標籤:Java
上一篇:一個簡單的超市訂單管理系統(1)
