Java 杂谈

JAVA8新特性:Stream

2019-06-27  本文已影响0人  白桦树97

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);
上一篇下一篇

猜你喜欢

热点阅读