一. Stream流:
1.1中间操作和终止操作的区别:
中间操作是流水线中的数据进行加工的, 它是一个懒操作, 并不会马上执行, 需要等待有终止操作的时候才会执行.
终止操作是Stream的启动操作, 当有终止操作的时候, Stream才会真正的开始执行.
List<Integer> list = Arrays.asList(4, 7, 9, 11, 12);
list.stream()
.peek(x -> System.out.println("stream: " + x));
没有输出,因为peek是中间操作,并不会马上执行, 需要等待有终止操作的时候才会执行。
List<Integer> list = Arrays.asList(4, 7, 9, 11, 12);
list.stream()
.peek(x -> System.out.println("stream: " + x))
.collect(Collectors.toList());
有输出如下:
因为collect是终止操作,是终止操作的时候, Stream才会真正的开始执行。
1.2 Stream流的整个过程
(1)生成流:通过数据源(集合,数组等)生成流
list.stream0
(2)中间操作:一个流后面可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流交给下一个操作使用
filter()
map()
limit()等等
(3)终结操作:一个流只能有一个终结操作,当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作
forEach()
collect()
findAny()等等
1.3 Stream流的常见生成方式
Collection体系的集合:可以使用默认方法stream()生成流default Stream stream()
Map体系的集合:间接的生成流
数组:可以通过Stream接口的静态方法of(T…values)生成流
具体如下:
集合与数组拿到Stream流:
** (1)由数值直接构建流
(2)由数组直接构建流
(3)通过文件生成流
(4) 函数生成流**
public static void main(String[] args){
/**
* 由数值直接构建流
*/
Stream stream = Stream.of(1, 2, 3, 4, 5);
System.out.println("由数值直接构建流:");
stream.forEach(System.out::println);
/**
* 由数组直接构建流
*/
int[] numbers = {1, 2, 8};
IntStream stream1 = Arrays.stream(numbers);
System.out.println("由数组直接构建流:");
stream1.forEach(System.out::println);
/**
* 通过文件生成流
*/
Stream<String> stream2 = null;
try {
stream2 = Files.lines(Paths.get("E://admin//java//JedisDemo/pom.xml"));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("通过文件生成流:");
stream2.forEach(System.out::println);
/**
* 函数生成流
*/
Stream stream3 = Stream.generate(Math::random);
System.out.println("函数生成流:");
stream3.limit(100).forEach(System.out::println);
}
1.4 Stream流的常见中间操作方法:
用于对流中的数据进行过滤:
Streamfilter(Predicate predicate)
Predicate接口中的方法,对给定的参数进行判断,返回一个布尔值
boolean test(T t)
1.4.1 filter使用(过滤掉不符合条件的数据):
1.4.2 limit(只取前面几条数据) 和 skip(跳过前面的几条数据)的使用:
1.4.3 concat 和 distinct(返回不同元素,相同的只返回一个)的使用:
1.4.4 sorted的使用(排序):
User user1 = new User();
User user2 = new User();
user1.setPhoneNum("19283");
user1.setUserName("小小");
user2.setPhoneNum("16736");
user2.setUserName("哈哈");
List<User> list1 = new ArrayList<>();
list1.add(user1);
list1.add(user2);
System.out.println("list1的数据:");
System.out.println(JSON.toJSONString(list1,true));
System.out.println("stream后的数据:");
list1.stream()
//按照id降序排
.sorted(Comparator.comparing(User::getUserName).reversed())
.forEach(item -> System.out.println(JSON.toJSONString(item,true)));
System.out.println("stream后的数据:");
list1.stream()
//按照id升序排
.sorted(Comparator.comparing(User::getUserName))
.forEach(item -> System.out.println(JSON.toJSONString(item,true)));
1.4.5 flatMap的使用(将一个对象转换成流):
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("id",1);
map1.put("amount", BigDecimal.valueOf(23));
map1.put("type","苹果");
Map<String, Object> map2 = new HashMap<>();
map2.put("id",2);
map2.put("amount",BigDecimal.valueOf(54));
map2.put("type","雪梨");
Map<String, Object> map3 = new HashMap<>();
map3.put("id",3);
map3.put("amount",null);
map3.put("type","苹果");
list.add(map1);
list.add(map2);
list.add(map3);
list.stream().peek(e -> e.get("type"));
System.out.println("list集合数据:");
System.out.println(list);
System.out.println("stream后的数据:");
list.stream()
.flatMap(e -> Arrays.stream(MapUtils.getString(e,"type").split("")))
.forEach(System.out::println);
}
1.4.6 map的使用(将一个元素转换成另一给元素):
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("id",1);
map1.put("amount", BigDecimal.valueOf(23));
map1.put("type","苹果");
Map<String, Object> map2 = new HashMap<>();
map2.put("id",2);
map2.put("amount",BigDecimal.valueOf(54));
map2.put("type","雪梨");
Map<String, Object> map3 = new HashMap<>();
map3.put("id",3);
map3.put("amount",null);
map3.put("type","苹果");
list.add(map1);
list.add(map2);
list.add(map3);
list.stream().peek(e -> e.get("type"));
System.out.println("list集合数据:");
System.out.println(list);
System.out.println("stream后的数据:");
//只获取type数据,以集合方式返回
list.stream().map(e -> MapUtils.getString(e,"type")).forEach(System.out::println);
}
1.4.7 peek的使用(查看流中间内容):
public static void main(String[] args) {
List<Integer> list = Arrays.asList(4, 7, 9, 11, 12);
list.stream()
.peek(x -> System.out.println("stream: " + x))
.map(x -> x + 2)
.peek(x -> System.out.println("map: " + x))
.filter(x -> x % 2 != 0)
.peek(x -> System.out.println("filter: " + x))
.limit(2)
.peek(x -> System.out.println("limit: " + x))
.collect(Collectors.toList());
}
1.4.8 peek和map的区别:
peek的定义:
Stream peek(Consumer<? super T> action);
peek方法接收一个Consumer的入参. 了解λ表达式的应该明白 Consumer的实现类应该只有一个方法,该方法返回类型为void. 它只是对Stream中的元素进行某些操作,但是操作之后的数据并不返回到Stream中,所以Stream中的元素还是原来的元素.
map的定义:
Stream map(Function<? super T, ? extends R> mapper);
map方法接收一个Function作为入参. Function是有返回值的, 这就表示map对Stream中的元素的操作结果都会返回到Stream中去.
1.5 Stream流的常见终结操作方法
1.5.1 foreach 和 count的使用:
对此流的每个元素执行操作(Consumer接口中的方法 ;voidaccept(Tt):对给定的参数执行此操作) :
void forEach(Consumer action)
返回此流中的元素数:
long count()
1.5.2 allMatch(是否集合中全部数据都符合条件,全部符合返回true,有一个不符合都返回false)
anyMatch(是否集合中有数据都符合条件,只要找到有一个符合条件就返回true,全部都不符合返回false)
noneMatch(是否集合中所有元素都不符合条件,只有都不符合条件才返回true,有一个符合条件就返回false)
User user1 = new User();
User user2 = new User();
user1.setPhoneNum("19283");
user1.setUserName("小小");
user1.setRole(18);
user2.setPhoneNum("16736");
user2.setUserName("哈哈");
user2.setRole(20);
List<User> list1 = new ArrayList<>();
list1.add(user1);
list1.add(user2);
System.out.println("list1的数据:");
System.out.println(JSON.toJSONString(list1,true));
System.out.println("stream后的数据:");
Boolean role1 = list1.stream()
//是否list1中全部role都小于19,全部小于返回true,有一个不小于都返回false
.allMatch(e -> e.getRole() < 19 );
System.out.println(role1);
System.out.println("stream后的数据:");
Boolean role2 = list1.stream()
.peek(e -> System.out.println(e.getRole()))
//list1中是否有role小于19,只要找到有一个小于19就返回true,全部都不小于19返回false
.anyMatch(e -> e.getRole() < 19);
System.out.println(JSON.toJSONString(list1,true));
System.out.println(role2);
Boolean role3 = list1.stream()
.peek(e -> System.out.println(e.getRole()))
//list1中是否所有role都不小于17,全部不小于返回true,有一个小于返回false
.noneMatch(e -> e.getRole() < 17);
System.out.println(JSON.toJSONString(list1,true));
System.out.println(role3);
1.5.3 findirst(获取第一条数据)
findAny(随机获取一条数据)
User user1 = new User();
User user2 = new User();
user1.setPhoneNum("19283");
user1.setUserName("小小");
user1.setRole(18);
user2.setPhoneNum("16736");
user2.setUserName("哈哈");
user2.setRole(20);
List<User> list1 = new ArrayList<>();
list1.add(user1);
list1.add(user2);
System.out.println("list1的数据:");
System.out.println(JSON.toJSONString(list1,true));
System.out.println("stream后的数据:");
//找到第一条数据,并用get()方法获取,没有数据是null,有数据是User对象
Optional<User> optional = list1.stream().findFirst();
System.out.println(JSON.toJSONString(optional.get(),true));
System.out.println("stream后的数据:");
//随机找到一条数据,并用get()方法获取,没有数据是null,有数据是User对象
Optional<User> optional2 = list1.stream().findAny();
System.out.println(JSON.toJSONString(optional2.get(),true));
1.5.4 Max(获取最大值)
Min(获取最小值)
count(获取一共有多少条数据)
User user1 = new User();
User user2 = new User();
user1.setPhoneNum("19283");
user1.setUserName("小小");
user1.setRole(18);
user2.setPhoneNum("16736");
user2.setUserName("哈哈");
user2.setRole(20);
List<User> list1 = new ArrayList<>();
list1.add(user1);
list1.add(user2);
System.out.println("list1的数据:");
System.out.println(JSON.toJSONString(list1,true));
System.out.println("stream后的数据:");
//获取Role最大的role值
OptionalDouble optionalDouble = list1.stream()
//mapToDouble把role值变成Double类型
.mapToDouble(User::getRole)
.max();
System.out.println(optionalDouble.getAsDouble());
System.out.println("stream后的数据:");
//获取Role最小的role值
OptionalDouble optionalDouble2 = list1.stream()
//mapToDouble把role值变成Double类型
.mapToDouble(User::getRole)
.min();
System.out.println(optionalDouble2.getAsDouble());
System.out.println("stream后的数据:");
//获取一共有多少条数据
Long count = list1.stream()
.count();
System.out.println(count);
1.6 Stream流的收集操作:
对数据使用Stream流的方式操作完毕后,我想把流中的数据收集到集合中,该怎么办呢?stream流的收集方法:
R collect(Collector collector)
但是这个收集方法的参数是一个Collector 接口
工具类Collectors提供了具体的收集方式:
publicstatic Collector toList(): 把元素收集到List集合中
publicstatic Collector toSet(): 把元素收集到Set集合中
publicstatic CollectortoMap(Function keyMapper,FunctionvalueMapper):把元素收集到Map集合中
1.6.1 collect的使用:
1.6.2 groupingBy(分组,按照某个字段分组,key为该字段的值)
partitioningBy(分区,符合条件和不符合条件的分组,key为布尔值)
User user1 = new User();
User user2 = new User();
User user3 = new User();
user1.setPhoneNum("19283");
user1.setUserName("小小");
user1.setRole(18);
user2.setPhoneNum("16736");
user2.setUserName("哈哈");
user2.setRole(20);
user3.setPhoneNum("18734");
user3.setUserName("丽丽");
user3.setRole(1);
List<User> list1 = new ArrayList<>();
list1.add(user1);
list1.add(user2);
list1.add(user3);
System.out.println("list1的数据:");
System.out.println(JSON.toJSONString(list1, true));
System.out.println("stream后的数据:");
Map<String, List<User>> listGroupMap = list1.stream()
//按照userName分组
.collect(Collectors.groupingBy(e -> e.getUserName()));
System.out.println(JSON.toJSONString(listGroupMap,true));
System.out.println("stream后的数据:");
Map<Boolean, List<User>> listGroupMap1 = list1.stream()
//按照userName分组
.collect(Collectors.partitioningBy(e -> e.getRole() > 18));
System.out.println(JSON.toJSONString(listGroupMap1,true));
1.7 总结:
例子:
List<Map<String,Object>> orgUnitList = new ArrayList<>();
Map<String,Object> orgUnit1 = new HashMap<>();
orgUnit1.put("id",1);
orgUnit1.put("unitName","组织1");
orgUnitList.add(orgUnit1);
Map<String,Object> orgUnit2 = new HashMap<>();
orgUnit2.put("id",2);
orgUnit2.put("unitName","组织2");
orgUnitList.add(orgUnit2);
System.out.println(orgUnitList);
List<Integer> allIdList = orgUnitList.stream().map(i -> Integer.parseInt(i.get("id").toString())).collect(Collectors.toList());
System.out.println(allIdList);
String treeSql = " select org.id,org.parentId as pId,org.unitName as name " +
" from orgunit org " +
" where org.id in ?1 ";
List<Map<String, Object>> orgUnitTreeList = jpaDao.nativeQueryAll(treeSql, allIdList);
System.out.println(orgUnitTreeList);
[{unitName=组织1, id=1}, {unitName=组织2, id=2}]
[1, 2]
[{name=超级管理员, pId=-1, id=1}, {name=总公司, pId=null, id=2}]
Lambda表达式:
任何一个接口,有且只有 一个抽象方法,那么它就是函数式接口。
抽象方法带参数,没有返回值:
抽象方法带参数,有返回值:
实例:
1.求某个人的总存款:
public static void main(String[] args) {
/**
* 创建集合数据
*/
List<Map<String,Object>> orderMapList = new ArrayList<>();
Map<String,Object> orderMap1 = new HashMap<>();
orderMap1.put("money",20.00);
orderMap1.put("name","LiLi");
Map<String,Object> orderMap2 = new HashMap<>();
orderMap2.put("money",33.34);
orderMap2.put("name","HaHa");
Map<String,Object> orderMap3 = new HashMap<>();
orderMap3.put("money",11.21);
orderMap3.put("name","LiLi");
orderMapList.add(orderMap1);
orderMapList.add(orderMap2);
orderMapList.add(orderMap3);
System.out.print("orderMapList:"+orderMapList+"\n");
/**
* 过滤出 name="LiLi" 的数据
*/
List<Map<String,Object>> liLiList = orderMapList.stream().filter(e -> e.get("name")
.equals("LiLi")).collect(Collectors.toList());
System.out.printf("liLiList:"+liLiList+"\n");
/**
* 计算出 name="LiLi" 的 money的和
*/
Double money = liLiList.stream().mapToDouble(e ->
Double.parseDouble(e.get("money").toString())).sum();
System.out.printf("money:"+money);
}
结果如图:
2.求list集合里的某个时间字段指定时间范围的数据:
public static void main(String[] args) {
/**
* 创建集合数据
*/
String stringA = "2021-01-07";
String stringB = "2021-01-08";
String stringC = "2021-01-09";
Date dateA = null;
Date dateB = null;
Date dateC = null;
try {
dateA = new SimpleDateFormat("yyyy-MM-dd").parse(stringA);
dateB = new SimpleDateFormat("yyyy-MM-dd").parse(stringB);
dateC = new SimpleDateFormat("yyyy-MM-dd").parse(stringC);
} catch (ParseException e) {
e.printStackTrace();
}
List<Map<String,Object>> orderMapList = new ArrayList<>();
Map<String,Object> orderMap1 = new HashMap<>();
orderMap1.put("date",dateA);
orderMap1.put("name","LiLi");
Map<String,Object> orderMap2 = new HashMap<>();
orderMap2.put("date",dateB);
orderMap2.put("name","HaHa");
Map<String,Object> orderMap3 = new HashMap<>();
orderMap3.put("date",dateC);
orderMap3.put("name","LiLi");
orderMapList.add(orderMap1);
orderMapList.add(orderMap2);
orderMapList.add(orderMap3);
System.out.print("orderMapList:"+orderMapList+"\n");
/**
* 字符串日期转Date
*/
String string1 = "2021-01-07";
String string2= "2021-01-09";
Date startDate1 = null;
Date endDate1 = null;
try {
//开始时间
startDate1 = new SimpleDateFormat("yyyy-MM-dd").parse(string1);
//结束时间
endDate1 = new SimpleDateFormat("yyyy-MM-dd").parse(string2);
} catch (ParseException e) {
e.printStackTrace();
}
Date startDate = startDate1;
Date endDate = endDate1;
System.out.printf("startDate:"+startDate+"\n");
System.out.printf("endDate:"+endDate+"\n");
/**
* 过滤出 时间在startDate到endDate 的数据
*/
List<Map<String,Object>> liLiList = orderMapList.stream()
//startDate小于date,endDate大于endDate的数据
.filter(e -> startDate.before((Date)e.get("date")) && endDate.after((Date)e.get("date")))
.collect(Collectors.toList());
System.out.printf("liLiList:"+liLiList+"\n");
}
结果如图:
3.对list集合里的某个字段进行降序排:
public static void main(String[] args) {
/**
* 创建集合数据
*/
List<Map<String,Object>> orderMapList = new ArrayList<>();
Map<String,Object> orderMap1 = new HashMap<>();
orderMap1.put("sore",12);
orderMap1.put("name","LiLi");
Map<String,Object> orderMap2 = new HashMap<>();
orderMap2.put("sore",34);
orderMap2.put("name","HaHa");
Map<String,Object> orderMap3 = new HashMap<>();
orderMap3.put("sore",38);
orderMap3.put("name","LiLi");
Map<String,Object> orderMap4 = new HashMap<>();
orderMap4.put("sore",38);
orderMap4.put("name","LiLiAA");
orderMapList.add(orderMap1);
orderMapList.add(orderMap2);
orderMapList.add(orderMap3);
orderMapList.add(orderMap4);
System.out.print("orderMapList:"+orderMapList+"\n");
/**
* 对orderMapList集合的分数进行降序排序
*/
Collections.reverse(orderMapList);
System.out.printf("liLiList:"+orderMapList+"\n");
结果如图:
4.对list集合里的某个字段进行升序排:
public static void main(String[] args) {
/**
* 创建集合数据
*/
List<Map<String,Object>> orderMapList = new ArrayList<>();
Map<String,Object> orderMap1 = new HashMap<>();
orderMap1.put("sore",12);
orderMap1.put("name","LiLi");
Map<String,Object> orderMap2 = new HashMap<>();
orderMap2.put("sore",34);
orderMap2.put("name","HaHa");
Map<String,Object> orderMap3 = new HashMap<>();
orderMap3.put("sore",38);
orderMap3.put("name","LiLi");
Map<String,Object> orderMap4 = new HashMap<>();
orderMap4.put("sore",38);
orderMap4.put("name","LiLiAA");
orderMapList.add(orderMap1);
orderMapList.add(orderMap2);
orderMapList.add(orderMap3);
orderMapList.add(orderMap4);
System.out.print("orderMapList:"+orderMapList+"\n");
/**
* 对list集合内的某个值进行排序处理
*/
//Collections.sort(),排序默认sort(),但是要保证集合中的对象是 可比较的。
//根据姓名unitName,fullName,customerName排序
//Collections.sort(dataList, (o1, o2) -> {
// return (((String)o2.get( "unitName" ) + (String)o2.get( "name" )).compareTo(
// (String)o1.get( "unitName" ) + (String)o1.get( "name" )));
//});
Collections.sort(orderMapList, Comparator.comparingInt(a -> Integer.valueOf(a.get("sore").toString()) ));
System.out.printf("liLiList:"+orderMapList+"\n");
}
结果如图:
5.按照集合中的某个key分组计算其它数据之和,并把计算的和写在每组同类key的最后面,效果如下图:
public static void main(String[] args) throws IOException, ClassNotFoundException {
//存放所有数据
List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
Map<String, Object> m1 = new HashMap<String, Object>();
m1.put("name", "张三");
m1.put("afterSaleProfit", 1.3);
m1.put("sore", 1.3);
dataList.add(m1);
Map<String, Object> m2 = new HashMap<String, Object>();
m2.put("name", "李四");
m2.put("afterSaleProfit", 2);
m2.put("sore", 2);
dataList.add(m2);
Map<String, Object> m3 = new HashMap<String, Object>();
m3.put("name", "李四");
m3.put("afterSaleProfit", 1.2);
m3.put("sore", 1.2);
dataList.add(m3);
Map<String, Object> m4 = new HashMap<String, Object>();
m4.put("name", null);
m4.put("afterSaleProfit", 0);
m4.put("sore", 1.2);
dataList.add(m4);
System.out.printf("原数据 dataList:" + dataList + "\n");
//过滤,保留name的值不为空的数据
dataList = dataList.stream().filter(e -> Objects.nonNull(e.get("name"))).collect(Collectors.toList());
System.out.printf("原过滤数据 dataList:" + dataList + "\n");
//过滤,保留name的值不为空的数据
dataList = dataList.stream().filter(e -> Objects.nonNull(e.get("name"))).collect(Collectors.toList());
System.out.printf("原过滤数据 dataList:" + dataList + "\n");
//dataList深度拷贝:必须先赋值给一个新集合,防止下面的stream处理中,影响(改变)原数据dataList
List<Map<String, Object>> oldDataList = (List<Map<String, Object>>)deepCopy(dataList);
System.out.printf("原数据 oldDataList:" + oldDataList + "\n");
//根据姓名name分组计算afterSaleProfit,sore的和,并按照name的名称加(小计)来显示每组的和
dataList = dataList.stream().collect(Collectors.groupingBy(d -> d.get("name"))).values().stream().map(d -> {
Map<String, Object> sampleData = d.get(0);
sampleData.put("name", d.get(0).get("name") + "(小计)");
sampleData.put("afterSaleProfit", d.stream().map(s -> new BigDecimal(s.get("afterSaleProfit").toString())).reduce(BigDecimal.ZERO, BigDecimal::add));
sampleData.put("sore", d.stream().map(s -> new BigDecimal(s.get("sore").toString())).reduce(BigDecimal.ZERO, BigDecimal::add));
return sampleData;
}).collect(Collectors.toList());
System.out.printf("分组合计 dataList:" + dataList + "\n");
System.out.printf("原数据 oldDataList:" + oldDataList + "\n");
//合并集每组数据的小计集合dataListByName到集合dataList中
dataList.addAll(oldDataList);
System.out.printf("合并 dataList:" + dataList + "\n");
//根据姓名name排序
dataList.sort(Comparator.comparing(e -> String.valueOf(e.get("name"))));
System.out.printf("排序 dataList:" + dataList + "\n");
}
//对象的深拷贝方法
public static Object deepCopy(Object src) throws IOException, ClassNotFoundException {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(src);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
@SuppressWarnings("unchecked")
Object dest = in.readObject();
return dest;
}
结果如下:
原数据 dataList:[{name=张三, afterSaleProfit=1.3, sore=1.3}, {name=李四, afterSaleProfit=2, sore=2}, {name=李四, afterSaleProfit=1.2, sore=1.2}, {name=null, afterSaleProfit=0, sore=1.2}]
原过滤数据 dataList:[{name=张三, afterSaleProfit=1.3, sore=1.3}, {name=李四, afterSaleProfit=2, sore=2}, {name=李四, afterSaleProfit=1.2, sore=1.2}]
原过滤数据 dataList:[{name=张三, afterSaleProfit=1.3, sore=1.3}, {name=李四, afterSaleProfit=2, sore=2}, {name=李四, afterSaleProfit=1.2, sore=1.2}]
原数据 oldDataList:[{name=张三, afterSaleProfit=1.3, sore=1.3}, {name=李四, afterSaleProfit=2, sore=2}, {name=李四, afterSaleProfit=1.2, sore=1.2}]
分组合计 dataList:[{name=李四(小计), afterSaleProfit=3.2, sore=3.2}, {name=张三(小计), afterSaleProfit=1.3, sore=1.3}]
原数据 oldDataList:[{name=张三, afterSaleProfit=1.3, sore=1.3}, {name=李四, afterSaleProfit=2, sore=2}, {name=李四, afterSaleProfit=1.2, sore=1.2}]
合并 dataList:[{name=李四(小计), afterSaleProfit=3.2, sore=3.2}, {name=张三(小计), afterSaleProfit=1.3, sore=1.3}, {name=张三, afterSaleProfit=1.3, sore=1.3}, {name=李四, afterSaleProfit=2, sore=2}, {name=李四, afterSaleProfit=1.2, sore=1.2}]
排序 dataList:[{name=张三, afterSaleProfit=1.3, sore=1.3}, {name=张三(小计), afterSaleProfit=1.3, sore=1.3}, {name=李四, afterSaleProfit=2, sore=2}, {name=李四, afterSaleProfit=1.2, sore=1.2}, {name=李四(小计), afterSaleProfit=3.2, sore=3.2}]
6.根据list的某个属性值分组。List<Map<String, Object>> 转换为Map<Integer, List<Map<String, Object>>> typeIdGroupMap
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String,Object> map1 = new HashMap<>();
Map<String,Object> map2 = new HashMap<>();
Map<String,Object> map3 = new HashMap<>();
map1.put("id",1);
map1.put("typeId",353);
map1.put("name","杨康");
map2.put("id",2);
map2.put("name","杨过");
map2.put("typeId",353);
map3.put("id",3);
map3.put("name","杨中");
map3.put("typeId",351);
list.add(map1);
list.add(map2);
list.add(map3);
Map<Integer, List<Map<String, Object>>> typeIdGroupMap = list
.stream()
.collect(Collectors.groupingBy(e -> MapUtils.getInteger(e,"typeId")));
Integer a = 1;
}
7.获取list中第一条数据。 List<Map<String, Object>> 转Map<String,Object>
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String,Object> map1 = new HashMap<>();
Map<String,Object> map2 = new HashMap<>();
Map<String,Object> map3 = new HashMap<>();
map1.put("id",1);
map1.put("typeId",353);
map1.put("name","杨康");
map2.put("id",2);
map2.put("name","杨过");
map2.put("typeId",353);
map3.put("id",3);
map3.put("name","杨中");
map3.put("typeId",351);
list.add(map1);
list.add(map2);
list.add(map3);
Map<String,Object> typeIdOneMap = list.stream().filter(e -> Objects.equals(MapUtils.getInteger(e,"typeId"),351)).findFirst().get();
Integer a = 1;
}
8.获取list中某个属性的所有值。 List<Map<String, Object>>转 List
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String,Object> map1 = new HashMap<>();
Map<String,Object> map2 = new HashMap<>();
Map<String,Object> map3 = new HashMap<>();
map1.put("id",1);
map1.put("typeId",353);
map1.put("name","杨康");
map2.put("id",2);
map2.put("name","杨过");
map2.put("typeId",353);
map3.put("id",3);
map3.put("name","杨中");
map3.put("typeId",351);
list.add(map1);
list.add(map2);
list.add(map3);
List<String> nameList = list
.stream().map(map -> MapUtils.getString(map, "name")).collect(Collectors.toList());
Integer a = 1;
}
9.根据list中的某个属性值整理成Map集合。List 转 Map<Integer,UserDTO>
public static void main(String[] args) {
List<UserDTO> userAuthorizeList = new ArrayList<>();
UserDTO userDTO = new UserDTO();
userDTO.setId(1);
userDTO.setRoleId(2);
userDTO.setUserName("小风");
userDTO.setPhoneNum("2233");
UserDTO userDTO1 = new UserDTO();
userDTO1.setId(2);
userDTO1.setRoleId(3);
userDTO1.setUserName("小云");
userDTO1.setPhoneNum("2233");
UserDTO userDTO2 = new UserDTO();
userDTO2.setId(3);
userDTO2.setRoleId(2);
userDTO2.setUserName("小阳");
userDTO2.setPhoneNum("2233");
userAuthorizeList.add(userDTO);
userAuthorizeList.add(userDTO1);
userAuthorizeList.add(userDTO2);
Map<Integer,UserDTO> userAuthorizeMap =
userAuthorizeList
.stream()
.collect(Collectors.toMap(UserDTO::getRoleId, UserDTO -> UserDTO));
Integer a = null;
}
10.以list中的某个属性为属性,list中另一个属性为值,组合成 Map<Integer, List>。 List<Map<String, Object>>转 Map<Integer, List>
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String,Object> map1 = new HashMap<>();
Map<String,Object> map2 = new HashMap<>();
Map<String,Object> map3 = new HashMap<>();
map1.put("id",1);
map1.put("typeId",353);
map1.put("name","杨康");
map2.put("id",2);
map2.put("name","杨过");
map2.put("typeId",353);
map3.put("id",3);
map3.put("name","杨中");
map3.put("typeId",351);
list.add(map1);
list.add(map2);
list.add(map3);
Map<Integer, List<Integer>> idAndTypeIdList =
list
.stream()
.collect(
Collectors.groupingBy(
e -> MapUtils.getInteger(e,"id"),
Collectors.mapping(e -> MapUtils.getInteger(e,"typeId"),Collectors.toList())
)
);
Integer a = 1;
}
11. 把List<Map<String,Object>> 中某个属性值合并成字符串:
public static void main(String[] args) {
List<Map<String,Object>> mapList = new ArrayList<>();
Map<String,Object> map1 = new HashMap<>();
map1.put("key","现金");
map1.put("money",23);
mapList.add(map1);
Map<String,Object> map2 = new HashMap<>();
map2.put("key","微信");
map2.put("money",64);
mapList.add(map2);
String mergedString = mapList
.stream()
.map(
item -> "" +item.get("key")).collect(Collectors.joining(": ")
);
System.out.println(mergedString);
}
12.List<Map<String, Object>>按照list的某个字段分组形成List
import com.smart.agriculture.util.MapperUtils;
@Autowired
private MapperUtils mapperUtils;
@GetMapping("/get_data")
public void data() {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("id",1);
map1.put("amount",23);
map1.put("type","苹果");
Map<String, Object> map2 = new HashMap<>();
map2.put("id",2);
map2.put("amount",54);
map2.put("type","雪梨");
Map<String, Object> map3 = new HashMap<>();
map3.put("id",3);
map3.put("amount",66);
map3.put("type","苹果");
list.add(map1);
list.add(map2);
list.add(map3);
NavigableMap<String,List<FruitVO>> listNavigableMap = list.stream()
.map(e -> mapperUtils.convertValue(e,FruitVO.class))
.collect(Collectors.groupingBy(FruitVO::getType,TreeMap::new,Collectors.toList()))
.descendingMap();
int size = listNavigableMap.size();
List<FruitRespVO> rows = new ArrayList<>(size);
for (Map.Entry<String,List<FruitVO>> entry : listNavigableMap.entrySet()) {
FruitRespVO fruitRespVO = new FruitRespVO();
fruitRespVO.setType(entry.getKey());
fruitRespVO.setFruitVOList(entry.getValue());
rows.add(fruitRespVO);
}
}
FruitRespVO.java:
package com.smart.agriculture.tally.api.vo;
import java.util.List;
public class FruitRespVO {
private String type;
private List<FruitVO> fruitVOList;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public List<FruitVO> getFruitVOList() {
return fruitVOList;
}
public void setFruitVOList(List<FruitVO> fruitVOList) {
this.fruitVOList = fruitVOList;
}
}
FruitVO.java
package com.smart.agriculture.tally.api.vo;
public class FruitVO {
private Integer id;
private Double amount;
private String type;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Double getAmount() {
return amount;
}
public void setAmount(Double amount) {
this.amount = amount;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
13.根据List<Map<String, Object>>集合中的某个BigDecimal属性求和:
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("id",1);
map1.put("amount",BigDecimal.valueOf(23));
map1.put("type","苹果");
Map<String, Object> map2 = new HashMap<>();
map2.put("id",2);
map2.put("amount",BigDecimal.valueOf(54));
map2.put("type","雪梨");
Map<String, Object> map3 = new HashMap<>();
map3.put("id",3);
map3.put("amount",null);
map3.put("type","苹果");
list.add(map1);
list.add(map2);
list.add(map3);
BigDecimal amount = list.stream()
.map(e ->
(BigDecimal)MapUtils.getNumber(e, "amount",BigDecimal.ZERO)
).reduce(BigDecimal.ZERO,BigDecimal::add);
}