美文网首页Java 杂谈
JAVA8新特性:Stream

JAVA8新特性:Stream

作者: 白桦树97 | 来源:发表于2019-06-27 12:05 被阅读0次

    1.筛选与切片:

    List<Device> list = new ArrayList<>();
            list.add(new Device(1,"yueliang"));
            list.add(new Device(1,"yueliang"));
            list.add(new Device(2,"xiannv"));
            list.add(new Device(3,"xiaohong"));
            list.add(new Device(5,"xiaolv"));
            list.add(new Device(7,"hah"));
            list.add(new Device(9,"xixi"));
    
     list.stream()
                    .filter(e->e.getId()<7)          //取id小于7的对象
                    .distinct()                      //去重,必须重写对象的equals和hashcode方法
                    .limit(3)                        //取前三个
                    .skip(1)                         //跳过第一个
                    .forEach(System.out::println);
    

    测试结果

    image.png

    2.映射:

    接受lambda,作用到每一个元素,并得到新值
    1.大小写转换

     List<String> list = Arrays.asList("xixi","hah","ddidi");
            list.stream()
                    .map(str->str.toUpperCase())
                    .forEach(System.out::println);   //输出结果转换为大写
    

    2.提取每个对象的名称

    List<Device> list = new ArrayList<>();
            list.add(new Device(1, "name1"));
            list.add(new Device(4, "hah"));
            list.add(new Device(3, "xixi"));
            list.stream()
                    .map(Device::getName)
                    .forEach(System.out::println);
    

    3.排序(自定义排序):

    按照id排序,如果id相同则按照姓名排序

    List<Device> list = new ArrayList<>();
            list.add(new Device(4, "hah"));
            list.add(new Device(1, "a"));
            list.add(new Device(1, "c"));
            list.add(new Device(1, "b"));
            list.add(new Device(3, "xixi"));
            list.stream()
                    .sorted((e1,e2)->{
                        if(e1.getId().equals(e2.getId())){
                            return  e1.getName().compareTo(e2.getName());
                        }else return e1.getId().compareTo(e2.getId());
    
                    })
                    .forEach(System.out::println);
    

    4.查找和匹配(以下均为终止操作):

    image.png

    例如:

            long count = list.stream().count();
            System.out.println(count);
    

    5.规约(将流中元素反复结合,形成一个新的值):

    下面即著名的goole框架模式 map-reduce

    Optional<Integer> sum = list.stream()
                    .map(e -> e.getId())
                    .reduce(Integer::sum);   //相当于.reduce((e1,e2)->e1+e2);
            System.out.println(sum);
    

    6.⭐️收集:(将流转换成其他集合形式)

    List<Device> collect = list.stream()
                    .filter(e->e.getId()<2)
                    .collect(Collectors.toList());
            collect.forEach(System.out::println);
    

    还有个小特性:惰性求值

           //中间操作,不执行任何操作
            Stream<Device> stream = list.stream()
                    .filter((e)->{
                        System.out.println("执行中间操作");
                        return e.getId()>2;
                    });
            //最终操作:一次执行全部内容,即:惰性求值
            stream.forEach(System.out::println);
    

    相关文章

      网友评论

        本文标题:JAVA8新特性:Stream

        本文链接:https://www.haomeiwen.com/subject/vknxcctx.html