怎样用Java 8优雅的开发业务
函数式编程
流式编程
基本原理
在Java中流式编程的基本原理有两点。
构建流
数据流转(流水线)
规约
IntStream.rangeClosed(1, 100) // 1. 构建流
.mapToObj(String::valueOf)// 2. 数据流转(流水线)
.collect(joining()); // 3. 规约
案例
英雄的主位置一共有几类,分别是什么
@Test
fun t1() {
// 英雄的主位置一共有几类,分别是什么
// 映射
val roleMains = heroes.map(Hero::getRoleMain)
// 过滤为空的数据
.filter(Objects::nonNull)
// 去重
.distinct()
println(roleMains.size)
println(roleMains)
}
@Test
public void t1() {
// 英雄的主位置一共有几类,分别是什么
List roleMains = heroes.stream()
// 映射
.map(Hero::getRoleMain)
// 过滤为空的数据
.filter(Objects::nonNull)
// 去重
.distinct()
// 收集列表
.collect(toList());
System.out.println(roleMains.size());
System.out.println(roleMains);
}
英雄按主次位置分组后,输出每个分组有多少英雄,其中:近战英雄有多少位,远程英雄有多少位
@Test
fun t2() {
// 英雄按主次位置分组后,输出每个分组有多少英雄,其中:近战英雄有多少位,远程英雄有多少位
// 主次位置分组的英雄数量
val groupHeroCount = heroes.groupingBy {
Pair.of(it.roleMain, it.roleAssist)
}.eachCount()
// 主次分组后,再按攻击范围分组的英雄数量
val groupThenGroupCount = heroes.groupBy {
Pair.of(it.roleMain, it.roleAssist)
}.map {
val value = it.value.groupingBy(Hero::getAttackRange).eachCount()
Pair.of(it.key, value)
}.associateBy({ it.left }, { it.value })
// 遍历输出
groupThenGroupCount.forEach { (groupKey, groupValue) ->
val groupingCount = groupHeroCount[groupKey]
print("英雄分组key为:$groupKey;英雄数量:$groupingCount;")
groupValue.forEach { (countKey, countValue) ->
print("英雄攻击范围:$countKey;英雄数量:$countValue;")
}
println()
}
}
@Test
public void t2() {
// 英雄按主次位置分组后,输出每个分组有多少英雄,其中:近战英雄有多少位,远程英雄有多少位
// 主次位置分组的英雄数量
Map, Long> groupHeroCount = heroes.stream()
.collect(groupingBy(hero -> Pair.of(hero.getRoleMain(), hero.getRoleAssist()), counting()));
// 主次分组后,再按攻击范围分组的英雄数量
Map, Map> groupThenGroupCount = heroes.stream()
.collect(groupingBy(hero -> Pair.of(hero.getRoleMain(), hero.getRoleAssist()),
groupingBy(Hero::getAttackRange, counting())));
// 遍历输出
groupThenGroupCount.forEach((groupKey, groupValue) ->