Java8 stream map collect foreach

例如有一个集合:

List<User> users = getList(); //从数据库查询的用户集合

现在想获取User的身份证号码;在后续的逻辑处理中要用;

常用的方法我们大家都知道,用for循环

List<String> idcards=new ArrayList<String>();//定义一个集合来装身份证号码

for(int i=0;i<users.size();i++){

  idcards.add(users.get(i).getIdcard());

}

这种方法要写好几行代码,有没有简单点的,有,java8 API能一行搞定:

List<String> idcards= users.stream().map(User::getIdcard).collect(Collectors.toList())

解释下一这行代码:

users:一个实体类的集合,类型为List<User>
User:实体类
getIdcard:实体类中的get方法,为获取User的idcard

stream()优点

无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
stream().map()方法的使用示例:

public static void main(String[] args){
    //toUpper转大写
    List<String> list = Arrays.asList("a","b","c");
    List<String> list1 = list.stream().map(String::toUpperCase).collect(Collectors.toList());
    System.out.println(list1);//[A, B, C]

    //某些计算
    List<Integer> num = Arrays.asList(1,2,3,4);
    List<Integer> num1 = num.stream().map(n->n*2).collect(Collectors.toList());
    System.out.println(num1);//[2, 4, 6, 8]
    List<Integer> num2 = num.stream().map(n->n*2).map(n->n-1).collect(Collectors.toList());
    System.out.println(num2);//1, 3, 5, 7]

    //forEach
    Stream<String> stream = Stream.of("a","b","c");
    stream.map(String::toUpperCase).forEach(System.out::println);//A \r\n B \r\n C
}

stream.map和stream.foreach区别

map

<R> Stream<R> map(Function<? super T, ? extends R> mapper)

map 方法接收一个功能型接口,功能型接口接收一个参数,返回一个值。map 方法的用途是将旧数据转换后变为新数据,是一种 1:1 的映射,每个输入元素按照规则转换成另一个元素。

foreach

void forEach(Consumer<? super T> action)

forEach 接收一个 Consumer 接口。它只接收不参数,没有返回值。然后在 Stream 的每一个元素上执行该表达式,类似加强for()语句

filter

Stream<T> filter(Predicate<? super T> predicate)

返回由此流的元素组成的流,该流匹配给定的谓词。例如:

stream.filter(e->e != null)

sorted

Stream<T> sorted(Comparator<? super T> comparator);
sorted((x,y)->{return x.get("value").compareTo(y.get("value"));})
或者
(推荐)sorted(Comparator.comparing(k->k.get("value").toString()))

实体类提取关键字段转成json

 

[{"id":1,"name":"aaa"},{"id":2,"name":"bbb"}]

        dataSourceList.stream().map(v -> {
            Map<String, Object> map = new HashMap<>();
            map.put("id", v.getId());
            map.put("sourceName", v.getSourceName());
            return map;
        }).collect(Collectors.toList())

 

 {
    "dataSourceType": [
        {
            "desc": "a",
            "value": 1
        },
        {
            "desc": "b",
            "value": 2
        }
    ],
    "xxStatus": [
        {
            "desc": "a",
            "value": 1
        },
        {
            "desc": "b",
            "value": 2
        }
    ]
}


List<SysDictionary> list = dictionaryService.list(queryWrapper);
        Map<String, List<SysDictionary>> collect = list.stream().collect(Collectors.groupingBy(SysDictionary::getDicType));
        Map<String, List<Map<String, String>>> resultMap = new HashMap<>();
        for (String c : collect.keySet()) {
            List<Map<String, String>> convertList = collect.get(c).stream().map(v -> {
                Map<String, String> convertMap = new HashMap<>();
                convertMap.put("desc", v.getDicName());
                convertMap.put("value", v.getDicValue());
                return convertMap;
            }).sorted((x,y)->{return x.get("value").compareTo(y.get("value"));}).collect(Collectors.toList());
            resultMap.put(c,convertList);
        }
        return JSON.toJSONString(resultMap);

 参考:https://www.cnblogs.com/ngy0217/p/11080840.html

https://blog.csdn.net/baidu_37107022/article/details/78568472

https://www.runoob.com/java/java8-streams.html

https://www.cnblogs.com/qdhxhz/p/9399015.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值