一、stream相关
1、stream.sorted
排序,本人用到次小list排序,用的sorted,不知道具体快多少,但是写起来还蛮方便的。
基本语法:
List collect = list.stream().sorted((a, b) -> {}).collect(Collectors.toList());
需求:
数据结构如下:
然后,按照年份+最小月份的日期倒叙排序。
代码:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.stream.Collectors;
/**
* @author hanky
* @date 2021/12/1
*/
public class Test {
public static void main(String[] args) {
String json = "xxxxxx";
JSONArray jarr = JSONArray.parseArray(json);
List<ShwoPsnPamentBaseInResDTO> list = JSONObject.parseObject(json, new TypeReference<List<ShwoPsnPamentBaseInResDTO>>() {
});
// 排序
List<ShwoPsnPamentBaseInResDTO> collect = list.stream().sorted((a, b) -> {
if (a.getMonList().size() > 0 && b.getMonList().size() > 0) {
String aBegin = a.getYear() + "" + (a.getMonList().get(0).length() > 1 ? a.getMonList().get(0) : "0" + a.getMonList().get(0));
String bBegin = b.getYear() + "" + (b.getMonList().get(0).length() > 1 ? b.getMonList().get(0) : "0" + b.getMonList().get(0));
return Integer.compare(Integer.parseInt(bBegin), Integer.parseInt(aBegin));
}
return 1;
}).collect(Collectors.toList());
// 排序后结果
System.out.println(JSON.toJSONString(collect).toString());
int compare = Integer.compare(1, 2);
System.out.println(compare);
}
}
2、stream.forEach
过于简单,实际上就是for循环,大部分情况下应该比for循环快
基本语法:
list.stream.forEach(a->{ 处理过程 })
3、steam.map
这个用到的就比较多了,收集集合中的某一元素的值为一个新list,是一个创造新东西的方法。(个人理解,有误请指教哈)
基本语法:
list.stream().map(Person::getName).collect(Collectors.toList());
list.stream().map(a->{}).collect(Collectors.toList());
需求:
要提取一个人员list中person中的name字段,组成一个新list。
代码:
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("小张");
p1.setAge("15");
Person p2 = new Person();
p2.setName("小王");
p2.setAge("13");
List<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
List<String> collect = list.stream().map(Person::getName).collect(Collectors.toList());
System.out.println(collect);
}
}
@Data
class Person{
private String name;
private String age;
}
输出结果:
[小张, 小王]
4、stream.filter
过滤,也很常用,这个也是获取新的,但是他是把当前list,进行过滤出符合条件的新list,list泛型是不变的。
基本语法:
list.stream().filter(item -> item.getValue().equals(a.getInsutype())).findFirst();
.findFirst() 是获取第一个新list中第一个,返回option对象,下面会加示例。也可以用 .collect(Collectors.toList()) 来收集结果。
需求:
将查询出的人员列表中,有需要把0,1这种数值按照数据字典,转换为汉字解释,比如0,1转换为男,女这种。
public class Test {
public static void main(String[] args) {
// 造数据
List<Person> list = new ArrayList<>();
Person p1 = Person.builder()
.name("小张")
.age("15")
.sex("0")
.build();
Person p2 = Person.builder()
.name("小王")
.age("16")
.sex("1")
.build();
list.add(p1);
list.add(p2);
// 性别数据字段
List<DataFrontSex> sexList = new ArrayList<>();
DataFrontSex d1 = DataFrontSex.builder()
.label("男")
.value("0")
.build();
DataFrontSex d2 = DataFrontSex.builder()
.label("女")
.value("1")
.build();
sexList.add(d1);
sexList.add(d2);
// 开始
list.forEach(p -> {
Optional<DataFrontSex> first = sexList.stream().filter(item -> item.getValue().equals(p.getSex())).findFirst();
p.setSex(first.get().getLabel());
});
System.out.println(list);
}
}
@Data
@Builder
class DataFrontSex {
private String value;
private String label;
}
@Data
@Builder
class Person {
private String name;
private String age;
private String sex;
}
上面的代码中filter就是过滤出了sexList中与person对象中的sex字段值相等的Optional<DataFrontSex>
这里会有个小问题,看下图,这里会有个警告:
所以处理一下:
first.ifPresent(f-> p.setSex(first.get().getLabel()));
ifPresent 就是Option的方法,isPresent即判断value值是否为空,而ifPresent就是在value值不为空时,做一些操作。
输出结果:
[Person(name=小张, age=15, sex=男), Person(name=小王, age=16, sex=女)]
先写这些,有遇到再补充