jdk8 Stream流 API

版权声明:本文为博主原创文章,未经博主允许不得转载: https://www.cnblogs.com/zwyu/p/9729309.html 

1、流 API 

filter():对元素进行过滤
map():将流的元素映射成另一个类型
distinct():去除流中重复的元素
sorted():对元素进行排序
forEach :对流中的每个元素执行某个操作
peek():与forEach()方法效果类似,不同的是,该方法会返回一个新的流,而forEach()无返回
limit():截取流中前面几个元素
skip():跳过流中前面几个元素
toArray():将流转换为数组
reduce():对流中的元素归约操作,将每个元素合起来形成一个新的值
collect():对流的汇总操作,比如输出成List集合
anyMatch():匹配流中的元素,类似的操作还有allMatch()和noneMatch()方法
findFirst():查找第一个元素,类似的还有findAny()方法
max():求最大值
min():求最小值
count():求总数

2、使用案例

(1)查找、匹配、排序、归约操作

 

import java.awt.print.Book;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.Comparator.comparing;

/**
 * Created by zwyu on 2018/9/30.
 */

public class test {
    public static List<People> getPeople(){
        Date dNow = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dNow);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        Date p1 = calendar.getTime();
        calendar.add(Calendar.DAY_OF_MONTH, -2);
        Date p2 = calendar.getTime();
        calendar.add(Calendar.DAY_OF_MONTH, -3);
        Date p3 = calendar.getTime();

        List<People> people = Arrays.asList(
                new People("张三", 10, p1),
                new People("李四", 20, p2),
                new People("老王", 30, p3)
        );
        return people;
    }

    public static void test1() {
        //anyMatch : 任意元素符合筛选条件则返回true
        boolean hasMatch = Stream.of("Java", "C#", "PHP", "C++", "Python")
                .anyMatch(s -> s.equals("Java"));

        //allMatch : 所有元素符合筛选条件才返回true
        boolean hasAllMatch = Stream.of("C#", "C++")
                .allMatch(s -> s.contains("C#"));

        //noneMatch : 所有元素的筛选条件为false 才返回true
        boolean nonMatch = Stream.of("C#", "C++")
                .noneMatch(s -> s.contains("C#a"));

        Optional<String> element = Stream.of("Java", "C#", "PHP", "C++", "Python")
                .filter(s -> s.contains("C"))
                // .findFirst()     // 获取流中第一个元素
                .findAny();         // 获取流中任意元素(其实也是返回第一个元素,能提高并行操作时的性能,推荐使用)

        // 输出结果:element: C#, hasMatch: true, hasAllMatch: false, nonMatch: true
        System.out.println("element: " + element.get() + ", hasMatch: " + hasMatch + ", hasAllMatch: " + hasAllMatch + ", nonMatch: " + nonMatch);

    }

    public static void test2() {
        Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10)
                .filter(n -> n > 2)     // 对元素过滤,保留大于2的元素,剩下3,4,5,6,7,8,9,10,10
                .distinct()             // 去重,类似于SQL语句中的DISTINCT,剩下3,4,5,6,7,8,9,10
                .skip(1)                // 跳过前面1个元素
                .limit(5)               // 返回开头5个元素,类似于SQL语句中的SELECT TOP
                .sorted()               // 对结果排序,如果元素是类对象则应该使用 sorted(Comparator<? super T> comparator)方法排序
                .forEach(System.out::print);
        // 输出结果:45678
    }

    public static void test3() {

        List<People> people = getPeople();

        long count = people.stream().count();

        // reduce:归约操作就是将流中的元素进行合并,形成一个新的值,常见的归约操作包括: 加减乘除、字符串拼接、求最值等功能
        Optional<Integer> totalAge = people.stream()
                .map(People::getAge)
                .reduce((n, m) -> n * m);

        Optional<People> maxPeople = people.stream().max(comparing(People::getAge));
        // 等价于 Optional<People> maxPeople = people.stream().min(Comparator.comparing(People::getAge).reversed());

        Optional<People> minPeople = people.stream().min(comparing(People::getAge));
        // 等价于Optional<People> minPeople = people.stream().max(Comparator.comparing(People::getAge).reversed());

        // sorted:根据年龄将People对象进行排序, reversed()对排序结果取反: 如之前排序结果是 小到大,加reversed()方法就变为了 大到小
        people.stream().sorted(comparing(People::getBirthday, Comparator.nullsFirst(Date::compareTo)).reversed()).forEach(System.out::println);

        /**
         * 输出结果:
         People{name='张三', age=10, birthday=Sat Sep 29 16:45:48 CST 2018}
         People{name='李四', age=20, birthday=Thu Sep 27 16:45:48 CST 2018}
         People{name='老王', age=30, birthday=Mon Sep 24 16:45:48 CST 2018}
         count:3, totalAge: 60, max: People{name='老王', age=30, birthday=Mon Sep 24 16:51:39 CST 2018}, min: People{name='张三', age=10, birthday=Sat Sep 29 16:51:39 CST 2018}
         */
        System.out.println("count:" + count + ", totalAge: " + totalAge.get() + ", max: " + maxPeople.get().toString() + ", min: " + minPeople.get().toString());
    }

    public static void test4() {
        // 利用reduce的归约操作 实现集合元素的加减乘除、字符串拼接、求最值等功能
        String str = Stream.of("A", "B", "C", "D").reduce("-", String::concat);
        String str2 = Stream.of("A", "B", "C", "D").collect(Collectors.joining("-"));

        int minValue = Stream.of(1, 2, 3, 4, 5).reduce(Integer.MAX_VALUE, Integer::min);
        int minValue2 = Stream.of(1, 2, 3, 4, 5).reduce(0, Integer::min);
        int minValue3 = Stream.of(1, 2, 3, 4, 5).reduce(Integer::min).get();
        int minValue4 = Stream.of(1, 2, 3, 4, 5).reduce(Integer::max).get();
        int minValue5 = Stream.of(1, 2, 3, 4, 5).reduce(Integer::sum).get();
        int minValue6 = Stream.of(1, 2, 3, 4, 5).reduce((n, m) -> n * m).get();

        int sum = Stream.of(1, 2, 3, 4).reduce(Integer::sum).get();
        int sum2 = Stream.of(1, 2, 3, 4).reduce(7, Integer::sum);

        /**
         * 输出结果:
         str: -ABCD, str2: A-B-C-D, minValue: 1, minValue2: 0, minValue3: 1, minValue4: 5, minValue5: 15, minValue6: 120, sum: 10, sum2: 17
         */
        System.out.println("str: " + str + ", str2: " + str2
                + ", minValue: " + minValue + ", minValue2: " + minValue2
                + ", minValue3: " + minValue3 + ", minValue4: " + minValue4
                + ", minValue5: " + minValue5 + ", minValue6: " + minValue6
                + ", sum: " + sum + ", sum2: " + sum2);
    }

    public static void test5() {
        /**
         * Collectors 常用的方法有:
         Collectors.toList();
         Collectors.toMap();
         Collectors.joining();
         Collectors.maxBy();
         Collectors.groupingBy(); 等
         */
        List<People> people = getPeople();

        // 求和
        long count = people.stream().collect(Collectors.counting());
        // 等价于long count = people.stream().count();

        Optional<People> optional = people.stream().collect(Collectors.maxBy(comparing(People::getAge)));
        // 等价于Optional<People> optional = people.stream().max(comparing(People::getAge));

        Optional<People> optional2 = people.stream().collect(Collectors.minBy(comparing(People::getAge)));
        // 等价于Optional<People> optional2 = people.stream().min(comparing(People::getAge));

    }

    public static void main(String[] args) {
        test1();
        test2();
        test3();
        test4();
    }
}

class People {
    private String name;
    private int age;
    private Date birthday;

    public People(String name, int age, Date birthday) {
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }
}

 

posted @ 2018-09-30 14:00  海贼の王  阅读(2992)  评论(0编辑  收藏  举报