为了账号安全,请及时绑定邮箱和手机立即绑定

最近用到的一些Java实例总结

2019.05.07 17:43 258浏览

最近使用到的一些实例总结

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=财务部}]
点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 邀请有奖 帮助中心 APP下载
官方微信

举报

0/150
提交
取消