有状态操作
distinct(去重)
保证元素的唯一性,通过 Object.equals(Object)
方法来判断元素是否相等。
List<String> list = Arrays.asList("a", "b", "c", "a", "b", "c");
list.stream().distinct().forEach(System.out::println);
// 输出:a b c
sorted(排序)
对元素进行排序,默认采用自然排序,流中元素需实现 Comparable
接口。
List<String> list = Arrays.asList("c", "a", "b");
list.stream().sorted().forEach(System.out::println);
// 输出:a b c
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().sorted((i1, i2) -> i2 - i1).forEach(System.out::println);
// 输出:5 4 3 2 1
多字段排序
List<Student> students = new ArrayList<>();
students.add(new Student("张三", 20));
students.add(new Student("李四", 18));
students.add(new Student("王五", 19));
students.add(new Student("赵六", 18));
// 按年龄升序,年龄相同按姓名升序
students.sort(Comparator.comparing(Student::getAge).thenComparing(Student::getName));
students.forEach(System.out::println);
skip
跳过指定数量的元素,返回一个扔掉了前 n 个元素的流。如果流中元素不足 n 个,则返回一个空流。与 limit(n)
互补。
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().skip(2).forEach(System.out::println);
limit
截断流,使其元素不超过给定数量。
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().limit(2).forEach(System.out::println);
// a
无状态
filter
过滤元素,保留符合条件的元素。
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().filter(s -> s.equals("a")).forEach(System.out::println);
map
对元素进行映射,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().map(String::toUpperCase).forEach(System.out::println);
flatMap
将多个流合并成一个流。
List<String> list1 = Arrays.asList("a", "b", "c");
List<String> list2 = Arrays.asList("d", "e", "f");
Stream.of(list1, list2).flatMap(Collection::stream).forEach(System.out::println);
peek
对每个元素执行操作并返回一个新的 Stream。
List<String> list = Arrays.asList("a", "b", "c", "d", "e");
list.stream().peek(System.out::println).forEach(System.out::println);