JAVA stream API使用

虽然更高版本的JDK已经发布,但是JDK8的变革还是比较巨大的,JDK8出现了stream,之前不是特别理解,偶尔简单使用一下,最近就主要实现以及API在此列出,把简单的使用先表述一下,方便理解和使用。下面可以对一些原理以及基于底层的实现列出。

首先对stream的操作可以分为两类,中间操作(intermediate operations)和结束操作(terminal operations):

中间操作总是会惰式执行,调用中间操作只会生成一个标记了该操作的新stream。
结束操作会触发实际计算,计算发生时会把所有中间操作积攒的操作以pipeline的方式执行,这样可以减少迭代次数。计算完成之后stream就会失效。
虽然大部分情况下stream是容器调用Collection.stream()方法得到的,但stream和collections有以下不同:

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

一:获取Stream

/**
 * Created on 2019/4/10.
 * Title: Simple
 * Description:
 * Copyright: Copyright(c) 2018
 * Company:
 *
 * @author wy
 */
public class StreamApi {
    public static void main(String[] args) {
        //集合(新建一个学生类)
        List<Student> studentList = new ArrayList<>();
        Student student = new Student();
        student.setAge(21);
        student.setName("张三");
        student.setGrade("5年级");
        Student student1 = new Student();
        student1.setAge(22);
        student1.setGrade("6年级");
        student1.setName("李四");
        studentList.add(student);
        studentList.add(student1);
        Stream<Student> studentStream = studentList.stream();
        //数组
        String[] arr = new String[]{"ab", "cd", "ef"};
        Stream<String> arrStream = Arrays.stream(arr);
        // 3、值
        Stream<String> stream = Stream.of("ab", "cd", "ef");
    }

}

二、stream方法使用

测试数据:

 //测试数据
        List<Student> list = Arrays.asList(
                // name,age
                new Student("张三", 11),
                new Student("王五", 20),
                new Student("王五", 91),
                new Student("张三", 8),
                new Student("李四", 44),
                new Student("李四", 44),
                new Student("李四", 44)
        );

1、forEach() 使用该方法迭代流中的每个数据

/**
 * Created on 2019/4/10.
 * Title: Simple
 * Description:
 * Copyright: Copyright(c) 2018
 * Company:
 *
 * @author wy
 */
public class StreamApi {


    public static void main(String[] args) {
        //测试数据
        List<Student> list = Arrays.asList(
                // name,age
                new Student("张三", 11),
                new Student("王五", 20),
                new Student("王五", 91),
                new Student("张三", 8),
                new Student("李四", 44),
                new Student("李四", 44),
                new Student("李四", 44)
        );
        System.out.println("-------------jdk  8  之前----------------------------");
        //jdk8之前
        for (Student student : list) {
            System.out.println(student);
        }
        System.out.println("-------------jdk  8 lambda----------------------------");
        //jdk8 lambda
        list.forEach(x -> System.out.println(x));
        System.out.println("-------------java 8 stream lambda----------------------------");
        // java 8 stream lambda
        list.stream().forEach(x -> System.out.println(x));
    }

}

测试结果Console展示:

 2、sorted() 使用该方法排序数据

  System.out.println("-----排序前-----");
        list.forEach(student -> System.out.println(student));
        System.out.println("-----排序后-----");
        // java 8 前
        System.out.println("java 8 前");
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge().compareTo(o2.getAge());
            }
        });
        for (Student student : list) {
            System.out.println(student);
        }
        // java 8 stream 方法引用
        System.out.println("java 8 stream 方法引用");
        list.stream().sorted(Comparator.comparing(Student::getAge)).forEach(user -> System.out.println(user));

效果展示console:

3、filter():使用该方法过滤

  // 输出年龄大于50的人
        System.out.println("-----过滤前-----");
        list.forEach(x -> System.out.println(x));
        System.out.println("-----过滤后-----");
        // java 8 前
        System.out.println("java 8 前");
        for(Student student: list){
            if (student.getAge() > 50) {
                System.out.println(student);
            }
        }
        // java 8 stream
        System.out.println("java 8 stream");
        list.stream().filter((Student student) -> student.getAge() > 50).forEach(user -> System.out.println(user));

效果展示console:

4、limit():使用该方法截断

        // 从第三个开始截断,只输出前三个
        System.out.println("-----截断前-----");
        list.forEach(user -> System.out.println(user));
        System.out.println("-----截断后-----");
        // java 8 前
        System.out.println("java 8 前");
        for (int i = 0; i < 3; i++) {
            System.out.println(list.get(i));
        }
        // java 8 stream
        System.out.println("java 8 stream");
        list.stream().limit(3).forEach(user -> System.out.println(user));

效果展示console:

5、skip():与limit互斥,使用该方法跳过元素

  // 跳过前三个元素,从第四个开始输出
        System.out.println("-----跳过前-----");
        list.forEach(x -> System.out.println(x));
        System.out.println("-----跳过后-----");
        // java 8 前
        System.out.println("java 8 前");
        for (int i = 3; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        // java 8 stream
        System.out.println("java 8 stream");
        list.stream().skip(3).forEach(x -> System.out.println(x));

效果展示console:

6、distinct():使用该方法去重,注意:必须重写对应泛型的hashCode()和equals()方法

  // 因为Arrays.asList() 返回的是Arrays的内部类ArrayList,操作remove,add会报错
        List<Student> students = new ArrayList(list);
        // 为list去除重复数据
        System.out.println("-----去重前-----");
        list.forEach(user -> System.out.println(user));
        System.out.println("-----去重后-----");
        // java 8 前
        System.out.println("java 8 前");
        for (int i = 0; i < students.size() - 1; i++) {
            for (int j = students.size() - 1; j > i; j--) {
                if (students.get(j).getAge().equals(students.get(i).getAge()) && students.get(j).getName()
                        .equals(students.get(i).getName())) {
                    students.remove(i);
                }
            }
        }
        for (Student student : students) {
            System.out.println(student);
        }
        // java 8 stream
        System.out.println("java 8 stream");
        students.stream().distinct().forEach(x -> System.out.println(x));
    

效果展示console:

 7.去重+按照年龄大于40以后从小到大+只取前二


            list.stream().distinct().filter(x -> x.getAge() > 40).sorted(
                    Comparator.comparing(Student::getAge)).limit(2).forEach(user -> System.out
                    .println(user));
        }

效果展示console: 

8.max,min,sum,avg,count 

 IntSummaryStatistics num = list.stream().mapToInt(u -> u.getAge())
                .summaryStatistics();
        System.out.println("总共人数:" + num.getCount());
        System.out.println("平均年龄:" + num.getAverage());
        System.out.println("最大年龄:" + num.getMax());
        System.out.println("最小年龄:" + num.getMin());
        System.out.println("年龄之和:" + num.getSum());

    }

效果展示console:

9、map():接收一个方法作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素

  // 只输出所有人的年龄
        System.out.println("------------映射前 输出所有人的年龄和姓名-----");
        list.stream().forEach(x -> System.out.println(x));
        System.out.println("-------------映射后----------------------------");
        List<Integer> ages = list.stream().map(user -> user.getAge()).collect(toList());
        ages.forEach(age -> System.out.println(age));

        // 小写转大写
        List<String> words = Arrays.asList("aaa", "vvvv", "cccc");
        System.out.println("------------------全部大写----------------------");
        List<String> collect = words.stream().map(s -> s.toUpperCase()).collect(toList());
        collect.forEach(s -> System.out.println(s));

效果展示console:

10、flatMap():对每个元素执行mapper指定的操作,并用所有mapper返回的Stream中的元素组成一个新的Stream作为最终返回结果,通俗易懂就是将原来的stream中的所有元素都展开组成一个新的stream

 //创建一个 装有两个泛型为integer的集合
        Stream<List<Integer>> stream = Stream.of(Arrays.asList(1, 2, 3), Arrays.asList(4, 5));
        // 将两个合为一个
        Stream<Integer> integerStream = stream.flatMap(
                (Function<List<Integer>, Stream<Integer>>) integers -> integers.stream());
        // 为新的集合
        List<Integer> collect = integerStream.collect(toList());
        System.out.println("新stream大小:"+collect.size());
        System.out.println("-----合并后-----");
        collect.forEach(o -> System.out.println(o));

效果展示console:

11、findFirst() :使用该方法获取第一个元素

 Student student = list.stream().findFirst().get();
        System.out.println(student);

 效果展示:

猜你喜欢

转载自blog.csdn.net/crossroads10/article/details/89166644