最近使用到的一些实例总结
List中数值列的操作
//先模拟一个List,比如通过SQL查询到的列表("select id,je from cw_bxzt")
List<Map<String,Object>> maps = Arrays.asList(new HashMap<String, Object>() {{
put("id", "1");
put("je", 1000d);
}}, new HashMap<String, Object>() {{
put("id", "2");
put("je", 2000d);
}});
//将列表转换成stream然后匹配到数值列再进行累加
System.out.println(maps.stream().map(map -> (Double)map.get("je")).reduce(0d, Double::sum));
输出为:
3000.0
对高精度数进行操作
BigDecimal jkje = new BigDecimal(30000.00);
BigDecimal yhje = new BigDecimal(3200.00);
//两数相减并保留2位小数
String value = jkje.subtract(yhje).setScale(2).toString();
System.out.println(value);
输出为:
26800.00
判断列表中有没有重复key
List<String> list = Arrays.asList(new String[]{"1", "2", "3", "4", "2", "3"});
//将list转为Set
Set set = new HashSet(list);
//判断两个集合的个数,如果list比set大,则说明有重复
System.out.println("list的个数====>"+list.size()+",set的个数====》"+set.size());
输出为:
list的个数====>6,set的个数====》4
判断某个数值在哪个范围段
场景,比如说根据金额在0-200之间收取20%的手续费,200-500之间收取30%,大于500收取50%。
//待比较的金额
double je = 432d;
//区间公式列表
List<HashMap<String, Double>> expressions = Arrays.asList(
new HashMap<String, Double>() {{//在0-200之间费率为20%
put("min", 0d);
put("max", 200d);
put("perc", 20d);
}},
new HashMap<String, Double>() {{//在200-500之间费率为30%
put("min", 200d);
put("max", 500d);
put("perc", 30d);
}},
new HashMap<String, Double>() {{//在500以上费率为60%
put("min", 500d);
put("max", Double.MAX_VALUE);
put("perc", 60d);
}});
//将区间公式列表过滤最小值小于当前金额,最大值大于当前金额,然后取出符合的费率,最后转换为Double型的列表
List<Double> percList = expressions.stream().filter(e -> e.get("min") < je && je <= e.get("max")).map(e -> e.get("perc")).collect(Collectors.toList());
//如果公式设置的没有问题的话,这里应该有一条数据
System.out.println("最后的费率列表个数:" + percList.size());
System.out.println("费率为:" + percList.get(0));
System.out.println("管理费应该收:" + (je * (percList.get(0)/100)));
输出为:
最后的费率列表个数:1
费率为:30.0
管理费应该收:129.6
对列表进行分组累加
场景,通过SQL将多张表关联查询出带数值的列表,想对其进行分组然后再累加。但是SQL实现过于复杂效率也比较低。可以使用此方法模拟分组累计。
//模拟数据列表 3个apple, 2个banana, others 1
List<HashMap<String, Object>> items = Arrays.asList(
new HashMap<String, Object>() {{
put("name", "apple");
put("count", 10);
put("perc", new BigDecimal("9.99"));
}},
new HashMap<String, Object>() {{
put("name", "banana");
put("count", 20);
put("perc", new BigDecimal("19.99"));
}},
new HashMap<String, Object>() {{
put("name", "orang");
put("count", 10);
put("perc", new BigDecimal("29.99"));
}},
new HashMap<String, Object>() {{
put("name", "watermelon");
put("count", 10);
put("perc", new BigDecimal("29.99"));
}},
new HashMap<String, Object>() {{
put("name", "papaya");
put("count", 20);
put("perc", new BigDecimal("9.99"));
}},
new HashMap<String, Object>() {{
put("name", "apple");
put("count", 10);
put("perc", new BigDecimal("9.99"));
}},
new HashMap<String, Object>() {{
put("name", "banana");
put("count", 10);
put("perc", new BigDecimal("19.99"));
}},
new HashMap<String, Object>() {{
put("name", "apple");
put("count", 20);
put("perc", new BigDecimal("9.99"));
}});
Map<String, Double> collect = items.stream().collect(Collectors.groupingBy(e -> getName(e), Collectors.summingDouble(e -> getPerc(e))));
System.out.println(collect);
//需要配合定义的方法来实现获取map对应的key值
private static String getName(Map map){
return map.get("name").toString();
}
private static Double getPerc(Map map){
return ConvertUtils.createDouble(map.get("perc"));
}
输出为
{papaya=9.99, banana=39.98, apple=29.97, orang=29.99, watermelon=29.99}
对两个Map中相同的Key值累加
场景,两个Map都有相同的Key,比如两个部门的收支情况进行合计。
Map<String,Double> bmftMap = new HashMap<String,Double>(){{put("01",20d);put("02",25d);put("03",45d);}};
Map<String,Double> xmftMap = new HashMap<String,Double>(){{put("01",13d);put("03",22d);}};
Map<String, Double> bmzcTatol = Stream.of(bmftMap, xmftMap).flatMap(map -> map.entrySet().stream()).collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> new Double(v1 + v2)
));
System.out.println(bmzcTatol);
输出为:
{01=33.0, 02=25.0, 03=67.0}
根据主表数据过滤详情列表并累加
场景,各部门的收入费用信息是通过复杂SQL从N张表中获取的,现在对费用信息根据部门进行合计。
//模拟部门的收入数据
List<Map<String, Object>> bmsrList = Arrays.asList(
new HashMap<String, Object>() {{
put("id", "201707281001201811305484863");
put("bmxh", "ff80808155305838015571dedfd50067");
put("je", "1");
put("fpnr", "购书费");
}},
new HashMap<String, Object>() {{
put("id", "201707281830512511658733714");
put("bmxh", "ff80808155305838015571dedfd50067");
put("je", "3");
put("fpnr", "购书费");
}},
new HashMap<String, Object>() {{
put("id", "201708281341335577716072993");
put("bmxh", "ff80808155305838015571dd4c870061");
put("je", "1300");
put("fpnr", "购书费");
}},
new HashMap<String, Object>() {{
put("id", "201708291056310917087507395");
put("bmxh", "ff80808155305838015571dedfd50067");
put("je", "0.04");
put("fpnr", "服务费");
}}
);
//模拟部门列表
List<Map<String, Object>> bmList = Arrays.asList(
new HashMap<String, Object>() {{
put("id", "ff80808155305838015556fb60930041");
put("bmmc", "办公室");
}},
new HashMap<String, Object>() {{
put("id", "ff80808155305838015556fb970d0042");
put("bmmc", "财务部");
}}
);
//对部门列表进行遍历
bmList.forEach(bm -> {
//获取部门ID
String bmxh = bm.get("id").toString();
//部门的收入列表转换为stream,过滤当前部门的标书费,然后匹配到金额,进行累加获得购书费的总额
Double bsf = bmsrList.stream().filter(bmsr -> bmsr.get("bmxh").equals(bmxh) && bmsr.get("fpnr").equals("购书费")).map(bmsr -> ConvertUtils.createDouble(bmsr.get("je"))).reduce(0d, Double::sum);
//部门的收入列表转换为stream,过滤当前部门的服务费,然后匹配到金额,进行累加获得服务费的总额
Double dlfwf = bmsrList.stream().filter(bmsr -> bmsr.get("bmxh").equals(bmxh) && bmsr.get("fpnr").equals("服务费")).map(bmsr -> ConvertUtils.createDouble(bmsr.get("je"))).reduce(0d, Double::sum);
//将计算出来的金额放进部门的Map里
bm.put("bsf", bsf);
bm.put("dlfwf", dlfwf);
});
System.out.println(bmList);
输出为:
[{bsf=0.0, id=ff80808155305838015556fb60930041, dlfwf=0.0, bmmc=办公室}, {bsf=0.0, id=ff80808155305838015556fb970d0042, dlfwf=0.0, bmmc=财务部}]
热门评论