- 简介
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream使用一种类似用SQL语句从数据库里查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。
这种风格将要处理的元素看作是一种流,流在管道中传输,并可以在管道的节点上进行处理,比如筛选,排序,聚合等。 -
使用时的注意点:例如list==>list 一定要 使用经过流处理后的返回值
举一个栗子
public static void main(String[] args) {
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println(filtered);
}
foreach方法
strings.stream().forEach(System.out::println);
strings.stream().forEach(n-> System.out.println(n));
map方法
strings.stream().map(n->n+n).distinct().collect(Collectors.toList());
strings.stream().map(n->n+n).forEach(n-> System.out.println(n));
filter方法
limit方法
List<String> filtered = strings.stream().limit(3).filter(string -> !string.isEmpty()).collect(Collectors.toList());
sorted方法
List<Integer> integerList = Arrays.asList(1,1,2,5,4,9,6,5);
integerList.stream().sorted().distinct().forEach(System.out::println);
count方法
System.out.println(integerList.stream().count());
toMap方法
Map<String, Student> collect = students.stream().collect(Collectors.toMap(Student::getName, a -> a));
Map<String, Integer> collect = students.stream().collect(Collectors.toMap(Student::getName, a -> a.getAge()));
Map<String, Student> collect = students.stream().collect(Collectors.toMap(Student::getName, a -> a));
collect.entrySet().stream().sorted(Comparator.comparingInt(t>t.getValue().getAge())).forEach(System.out::println);
groupingBy方法
Map<String, List<Student>> map = students.stream().collect(Collectors.groupingBy(Student::getName, Collectors.toList()));
根据实体类某个字段排序
//有返回值 使用时应该取返回值
students.stream().sorted(Comparator.comparingInt(Student::getAge)).collect(Collectors.toList());
students.stream().sorted(Comparator.comparingInt(t>t.getAge())).collect(Collectors.toList());
//无返回值 直接使用students
students.sort(Comparator.comparingInt(t->t.getAge()));
students.sort(Comparator.comparingInt(Student::getAge));
students.sort(Comparator.comparingInt(Student::getAge).reversed());
students.sort(Comparator.comparing(t->t.getAge(),Comparator.reverseOrder()));
students.sort(Comparator.comparingInt(Student::getAge).reversed().thenComparingInt(Student::getHeight));
System.out.println(students);
List<Student> collect = students.stream().sorted(Comparator.comparingInt(Student::getAge).reversed().thenComparingInt(Student::getHeight)).collect(Collectors.toList());
ystem.out.println(collect);
先按照年龄正序,年龄相同再根据身高倒序
Student zhangsan = new Student("zhangsan", 12, 130);
Student lisi = new Student("lisi", 18, 170);
Student wangwu = new Student("wangwu", 19, 180);
Student zhaoliu = new Student("zhaoliu", 19, 160);
List<Student> students = new ArrayList<>();
students.add(zhangsan);
students.add(lisi);
students.add(wangwu);
students.add(zhaoliu);
students.sort((o1, o2) -> o1.getAge() - o2.getAge() == 0 ? o2.getHeight() - o1.getHeight() : o1.getAge() - o2.getAge());
students.stream().forEach(System.out::println);