JDK1.8 Stream笔记

该笔记转载于他人,并经过自己手敲测试!!

 

一、Stream简介

1、Java 8引入了全新的Stream API。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。

2、stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。

3、只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。

/*
     *   中间操作:(1.返回结果依然是流  2.中间操作是延迟的,遇到终结操作才会触发执行  3.中间操作是流水线形式的)
     *   筛选与切片
     *         filter:接收流中的元素,从流中排除某些元素
     *         limit:截断流,使元素不超过给定数量
     *         skip(n): 跳过前n个元素,返回剩余的元素,若流中元素不足n个,则返回空流
     *         distinct:筛选,通过流所生成元素的hashCode和equals去除重复元素
     *   映射:
     *       map:接收lambda,将元素转换成其它形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
     *       flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连城一个流
     *   排序:
     *       sorted():自然排序(Comparable)
     *       sorted(Comparator com):定制排序(Comparator)
     */

二、Stream的优势

1、函数式编程带来的好处,我认为主要是在于使得代码逻辑更加清晰,可读性增强,便于维护,也更加不容易出错。

2、使用Stream对集合的一些操作,往往代码量只有传统的循环遍历的一半甚至更少。less code,less bug!

3、有逼格

三、示例数据源

public List<Map<String,Object>> list(){
    Map<String,Object> map1=new HashMap<>();
    map1.put("id","1");
    map1.put("name","小张");
    map1.put("age","10");
    map1.put("sex","男");
    Map<String,Object> map2=new HashMap<>();
    map2.put("id","2");
    map2.put("name","小李");
    map2.put("age","15");
    map2.put("sex","女");
    Map<String,Object> map3=new HashMap<>();
    map3.put("id","3");
    map3.put("name","小王");
    map3.put("age","30");
    map3.put("sex","男");
    List<Map<String,Object>> list=new ArrayList<>();
    list=  Arrays.asList(map1,map2,map3);
    return list;
}

四、Fiter

fiter接受一个函数作为参数,该函数用lambda表达式表示。如性别为男,则会将所有性别为男的元素留下,余下的剔除。

List<Map<String,Object>> list =new test().getlist();
System.out.println(list);
List<Map<String,Object>> list2=  list.stream().filter(stu->
        stu.get("sex").equals("男")).collect(toList());
System.out.println(list2);

控制台输出:

lanbda表达式中 ->右边返回boolean类型:true 则留下,false则剔除

public static void main(String[] args) {

        List<Map<String, Object>> list = new test().getlist();
        System.out.println(list);
        List<Map<String, Object>> list2 = list.stream().filter(stu -> {
                    if (Integer.parseInt(stu.get("age").toString()) > 20) {
                        return true;
                    } else {
                        return false;
                    }
                }
        ).collect(toList());
        System.out.println(list2);
    }

输出:

特别注意:这里fiter操作是创建了一个新的对象的,也就是说并不会改变原list,因此必须要接一下。

五、Map

Map是将list中的元素改变,比较常用,也很好用

    public static void main(String[] args) {


        List<Map<String, Object>> list = new test().getlist();
        System.out.println(list);
        list.stream().map(stu->{
            stu.put("score",90);
            return stu;
                }
        ).collect(toList());

        System.out.println(list1);
    }

输出:

注意一点Map方法,当返回的是原对象本身的时候,就不会创建新的List对象,也就是说原来的list会改变,正常用的时候也就不需要接了。

而如果返回的不是原对象的话,就会创建新list对象了,就需要接一下。这里也很好理解,如果这里不创建新对象的话,原来对象有泛型约束,就矛盾了啊。示例如下:

 public static void main(String[] args) {


        List<Map<String, Object>> list = new test().getlist();
        System.out.println(list);
        List<String> list1= list.stream().map(stu->{
                    return stu.get("name").toString();
                }
        ).collect(toList());

        System.out.println(list1);
    }

输出:

六、FlatMap

flatMap返回参数为Stream,可以将list中的元素拆分为多个list。

    public static void main(String[] args) {
        List<Map<String, Object>> list = new test().getlist();
        System.out.println(list);
        List<String> list1= list.stream().flatMap(person->{
            String[] names= person.get("name").toString().split("-");
            return Arrays.stream(names);
        }).collect(toList());
        System.out.println(list1);
    }

输出:

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值