Java8 Lambda 之 Collection Stream
程序员文章站
2022-08-31 16:17:07
Lambda 之 Collection Stream Collection.stream() 测试实体类 1.map + collect用法 场景1:获取List列表的所有id No Lambda Lambda’s show 最后 可以有更多的实现,比如 场景2:list变成map 有时候我们把li ......
lambda 之 collection stream
collection.stream()
测试实体类
class demo { private long id; private string name; // getters and setters } // 实例化并组成一个list list<demo> demos = lists.newarraylist(new demo(1l, "sf"), new demo(2l, "axe"));
1.map + collect用法
场景1:获取list
no lambda
public static list<long> getids(list<demo> demos){ list<long> ids = lists.newarraylist(); for (demo d : demos) { ids.add(d.getid()); } return ids; }
lambda’s show
list<long> ids = demos.stream().map(demo::getid).collect(tolist());
最后tolist()
可以有更多的实现,比如
set<long> ids = demos.stream().map(demo::getid).collect(toset());
场景2:list变成map
有时候我们把list变成map,将多次list的o(n)
遍历变成map的o(1)
查询,拿空间换时间
no lambda
public static map<long, demo> getids(list<demo> demos){ map<long, demo> map = maps.newhashmap; for (demo d : demos) { map.put(d.getid, d); } return map; }
lambda‘s show
map<long, demo> map = demos.stream().collect(tomap(demo::getid, o -> o));
2.filter
场景1:从listname="sf"
的demo实例
no lambda
public static demo getspecifydemo(string name, list<demo> demos){ demo target = null; for (demo demo : demos) { if (name.equals(demo.getname())) { target = demo; } } return target; }
lambda's show--粗犷的老汉推车
string targetname = "sf"; demo target = demos.stream().filter(d -> targetname.equals(d.getname())).findfirst().orelse(null);
这种写法非常简单,但是调用链太长,一个lambda能够绕地球好几圈,最好写成以下格式,防止步子迈得太大。
lambda's show--优雅传教士
demo target = demos.stream() .filter(d -> targetname.equals.equals(d.getname())) .findfirst() .orelse(null);
find()
的结果是optional
,optional
号称npe
终结者,于是对于find()
的结果你可以随意使用终结者携带的任何武器,例如orelse()
,ifpresent()
,ispresent()
...每个用起来都是那种哒哒哒冒蓝火的,更多姿势详见optional
的裸体源码。
3.match
match()
是filter()
的缩写版本,返回结果只有boolean
类型,返回是否匹配。
场景1:当前list中某个元素是否符合某个条件
这个例子,给出另一个用法demo::getid
no lambda
list<string> condition = new arraylist<>(); condition.add("sf"); public static boolean isexist(list<string> condition, list<demo> demos){ boolean flag = false; for (demo demo : demos) { if (condition.contains(demo.getname())) { flag = true; break; } } return flag; }
lambda's show 使用filter
boolean flag = demos.stream() .map(demo::getname) .filter(condition::contains) .findany() .ispresent();
lambda's show 直接使用match
boolean flag = demos.stream() .map(demo::getname) .anymatch(condition::contains);
推荐阅读