当前位置: 移动技术网 > IT编程>开发语言>Java > Java8 Lambda 之 Collection Stream

Java8 Lambda 之 Collection Stream

2019年02月27日  | 移动技术网IT编程  | 我要评论

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列表的所有id

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:从list中找到name="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);

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网