使用Stream流操作List
体验:操作集合变得简单,代码变得简介(必须得会)
话不多说 上代码(举例几种常用的)
一、filter 过滤
filter 顾名思义 过滤 => 将满足条件体里条件的单元全部过滤出来成一个Stream流再通过collect(Collectors.toList())收集成一个List
找出所有性别为女的角色:
List<TestValue> filterList = myList.stream().filter(i->"女".equals(i.getSex())).collect(Collectors.toList());
格式:List.stram().filter(i->条件体).collect(Collectors.toList())
二、limit() 约束长度
截取前两条数据 limit(2):
List<TestValue> filterLimitList = myList.stream().limit(2).collect(Collectors.toList());
格式:List.stram().limit(长度Long)
三、forEach 遍历
将所有的角色年龄都变为18岁:
myList.forEach(i->i.setSex("18"));
格式:List.forEach(i->(xxxx))
四、Collectors.toList() 将流转换为List格式
五、Collectors.toMap 将某流中某两个字段转换成k-v形式的Map格式
//::为lambda表达式可以理解为new TestValue().getXXX
Map<String, String> map = myList2.stream().collect(Collectors.toMap(TestValue2::getAddress, TestValue2::getPlanet));
格式:myList2.stream().collect(Collectors.toMap(key, value));
5、示例测试
1、角色实体类TestValue
package org.jeecg.modules.portal.controller.test.entity;
public class TestValue {
private String name;
private String age;
private String sex;
private String address;
private String planet; //星球
public TestValue(String name,String age,String sex,String address){
this.name = name;
this.age = age;
this.address = address;
this.sex = sex;
}
public String getName() {
return name;
}
public TestValue setName(String name) {
this.name = name;
return this;
}
public String getAge() {
return age;
}
public TestValue setAge(String age) {
this.age = age;
return this;
}
public String getSex() {
return sex;
}
public TestValue setSex(String sex) {
this.sex = sex;
return this;
}
public String getAddress() {
return address;
}
public TestValue setAddress(String address) {
this.address = address;
return this;
}
public String getPlanet() {
return planet;
}
public void setPlanet(String planet) {
this.planet = planet;
}
}
2、区域实体类TestValue2
package org.jeecg.modules.portal.controller.test.entity;
public class TestValue2 {
private String address;
private String planet;//星球
private String galaxy;//星系
public TestValue2(String address,String planet,String galaxy){
this.address = address;
this.planet = planet;
this.galaxy = galaxy;
}
public String getAddress() {
return address;
}
public TestValue2 setAddress(String address) {
this.address = address;
return this;
}
public String getPlanet() {
return planet;
}
public TestValue2 setPlanet(String planet) {
this.planet = planet;
return this;
}
public String getGalaxy() {
return galaxy;
}
public TestValue2 setGalaxy(String galaxy) {
this.galaxy = galaxy;
return this;
}
}
3.控制器(嫌麻烦可以自己在main方法里面跑)
@ApiOperation(value = "测试-流", notes = "测试-流")
@PutMapping(value = "/testD")
public Result<?> testD() {
List<TestValue> myList = new ArrayList<>();
myList.add(new TestValue("黑百合", "28", "女", "伊里奥斯"));
myList.add(new TestValue("白百合", "38", "男", "阿努比斯"));
myList.add(new TestValue("绿百合", "18", "女", "月球基地"));
myList.add(new TestValue("红百合", "48", "男", "国王大道"));
myList.add(new TestValue("黄百合", "18", "女", "沃斯卡亚"));
myList.add(new TestValue("蓝百合", "08", "男", "努巴尼"));
myList.add(new TestValue("香水百合", "18", "女", "伊里奥斯"));
List<TestValue2> myList2 = new ArrayList<>();
myList2.add(new TestValue2("伊里奥斯", "星球A", "星系1"));
myList2.add(new TestValue2("阿努比斯", "星球B", "星系1"));
myList2.add(new TestValue2("月球基地", "星球A", "星系1"));
myList2.add(new TestValue2("国王大道", "星球D", "星系2"));
myList2.add(new TestValue2("沃斯卡亚", "星球E", "星系3"));
myList2.add(new TestValue2("努巴尼", "星球G", "星系3"));
myList2.add(new TestValue2("扎克镇", "星球G", "星系3"));
//结合使用
//获取区域与星系的关系map (::为lambda表达式可以理解为new TestValue().getXXX)
//将某两个字段转换成k-v形式的Map
Map<String, String> map = myList2.stream().collect(Collectors.toMap(TestValue2::getAddress, TestValue2::getPlanet));
//给每个角色赋予星系的属性(先遍历foreach -> 然后从地址信息关系map中获取到对应的星系)
myList.forEach(TestValue->TestValue.setPlanet(map.get(TestValue.getAddress())));
//filter 顾名思义 过滤 => 将满足条件体里条件的单元全部过滤出来成一个Stream流再通过collect(Collectors.toList())收集成一个List
//过滤出性别为女的所有角色 这里的i 可以任意取 相当于是myList的的泛型 => new TestValue()
List<TestValue> filterList = myList.stream().filter(i -> "女".equals(i.getSex())).collect(Collectors.toList());
//过滤出性别为女的前两条数据
List<TestValue> filterLimitList = myList.stream().filter(i -> "女".equals(i.getSex())).limit(2).collect(Collectors.toList());
//遍历List
//将所有的sex变成"18"
myList.forEach(i->i.setSex("18"));
return Result.OK(myList);
}