欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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