前言

java8的Stream 流式操作,用於對集合進行投影、轉換、過濾、排序、去重等,更進一步地說,這些操作能鏈式串聯在一起使用,類似於 SQL 語句,可以大大簡化程式碼。下面我就將平時常用的一些stream操作做一些彙總。

通過 IntStream 構造基本型別的流

        //在java8之前,遍歷0-99的基本操作
for(int i = 0;i<100;i++){
System.out.println("i:"+i);
} //使用IntStream序列遍歷
IntStream.rangeClosed(0,99).forEach(i->{
System.out.println("i:"+i);
}); //使用IntStream並行遍歷
IntStream.rangeClosed(0,99).parallel().forEach(i->{
System.out.println("i:"+i);
});

定義一個學生的結構體,為後續操作做準備

class Student{
private String name;
private int age;
private int score;
private String city; public Student(String name, int age, int score, String city) {
this.name = name;
this.age = age;
this.score = score;
this.city = city;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public int getScore() {
return score;
} public void setScore(int score) {
this.score = score;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
score == student.score &&
Objects.equals(name, student.name) &&
Objects.equals(city, student.city);
} @Override
public int hashCode() {
return Objects.hash(name, age, score, city);
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
", city='" + city + '\'' +
'}';
}
} //構造資料
List<Student> students = new ArrayList<>();
students.add(new Student("stu001",18,70,"合肥"));
students.add(new Student("stu001",18,70,"合肥"));
students.add(new Student("stu002",23,80,"鄭州"));
students.add(new Student("stu003",45,90,"鄭州"));
students.add(new Student("stu004",32,73,"合肥"));
students.add(new Student("stu005",66,76,"南京"));
students.add(new Student("stu006",34,79,"杭州"));
students.add(new Student("stu007",28,90,"合肥"));
students.add(new Student("stu008",19,100,"杭州"));

filter

根據特定的條件進行過濾

//filter 實現過濾操作,這邊過濾出年齡大於30的學生
students.stream().filter(s->s.getAge()>30).forEach(System.out::println);

map

元素進行轉化

 //map 對流每一個元素進行轉化,將student的age轉化成流
students.stream().map(Student::getAge).forEach(System.out::println);

sort 排序

根據條件進行排序操作

//sort 按年齡排序,倒序
students.stream().sorted(Comparator.comparing(Student::getAge).reversed()).forEach(System.out::println);

distinct 去重

對流元素進行去重操作

//distinct 去重,因為實現了hashcode和equals,名稱為stu001的學生重複了
students.stream().distinct().forEach(System.out::println);

將集合組成一個list

students.stream().map(Student::getAge).collect(Collectors.toList()).forEach(System.out::println);

將集合組成一個set

students.stream().map(Student::getAge).collect(Collectors.toSet()).forEach(System.out::println);

最大值

求出年齡最大的學生

System.out.println(students.stream().max(Comparator.comparingInt(Student::getAge)).get());

最大值

求出年齡最最小的學生

System.out.println(students.stream().min(Comparator.comparingInt(Student::getAge)).get());

join操作

按照逗號進行join,用[]包裹起來

//join操作,姓名join
System.out.println(students.stream().map(Student::getName).collect(Collectors.joining(",","[","]")));

toMap操作

根據指定key,value生成一個map

students.stream().collect(Collectors.toMap(Student::getName,student -> student,(x1,x2)->x2)).entrySet().forEach(System.out::println);