不讲原理,只说用法。
1,集合遍历
public class StreamTest { public static void main(String[] args) { //1 遍历 Listlist = new ArrayList<>(); list.add("aaa"); list.add("bbb"); //使用lambda表达式输出list中的每个值 list.forEach(c->{ System.out.println(c); }); //调用方法 list.forEach(StreamTest::showList); } public static void showList(String value) { System.out.println(value); } }
2,筛选集合
Listlist = new ArrayList<>(); list.add("aaa"); list.add("absc"); list.add("bbb"); List selectResult = list.stream().filter(value->{ return value.startsWith("a"); }).collect(Collectors.toList());
4,筛选并去重
Listlist = new ArrayList<>(); list.add("aaa"); list.add("aaa"); list.add("absc"); list.add("bbb"); List selectResult = list.stream().filter(value->{ return value.startsWith("a"); }).distinct().collect(Collectors.toList());
5,截断流 取出结果的前n个元素
Listlist = new ArrayList<>(); list.add("aaa"); list.add("aaa"); list.add("absc"); list.add("bbb"); List selectResult = list.stream().filter(value->{ return value.startsWith("a"); }).limit(3).collect(Collectors.toList());
6,跳过元素,它和limit是互补的
Listlist = new ArrayList<>(); list.add("aaa"); list.add("aaa"); list.add("absc"); list.add("bbb"); List selectResult = list.stream().filter(value->{ return value.startsWith("a"); }).skip(3).collect(Collectors.toList());
7,映射,对集合的每个元素操作,比如获取背包中所有物品的数量
ListcountList = role.getBag().getBagMap().values().stream().map(BagItem::getCount).collect(Collectors.toList());
8,集合流操作 ,例如 找到玩家背包中道具数据大于5的前3个道具id
Role role = new Role(); Listresult = role.getBag().getBagMap().values(). stream().filter(item -> item.getCount() > 5).map(BagItem::getItemId). limit(3).collect(Collectors.toList());
其中,filter是过滤,map是遍历所有项,并返回一个值,limit是取三个结果,collect是收集并返回。只有在collect时才执行计算代码。
9,流的扁平化 flatmap
它可以把几个相同类型的流合并成一个新的流。比如,获取List
Listlist = new ArrayList<>(); list.add("aaa"); list.add("aaa"); list.add("absc"); list.add("bbb"); List selectResult = list.stream().map(v->v.split("")).flatMap(Arrays::stream).distinct().collect(Collectors.toList());
输出结果
[a, b, s, c]
10,匹配判断
Listlist = new ArrayList<>(); list.add("aaa"); list.add("aaa"); list.add("absc"); list.add("bbb"); //是否所有的项都是以a开头 boolean result = list.stream().allMatch(c->{ return c.startsWith("a"); }); System.out.println(result); //是否有任何一项是否以a开头 result = list.stream().anyMatch(c->{ return c.startsWith("a"); }); //是否都不以a开头 result = list.stream().noneMatch(c->{ return c.startsWith("a"); });
这就是对应Java中的&& ,||
11,list转map
//转map Listroles = new ArrayList<>(); Map map = roles.stream().collect(Collectors.toMap(Role::getRid, role-> role));
欢迎加群交流,QQ群:66728073,197321069,398808948