Stream—sort排序(二)

 

List<Student> list = new ArrayList<>();

Student s1 = new Student("zhangsan","beijing",30,90.0);
list.add(s1);

Student s2 = new Student("lisi","shanghai",29,80.8);
list.add(s2);

Student s3 = new Student("lining","shandong",31,70.8);
list.add(s3);

Student s4 = new Student("fanbingbing","beijing",34,70.0);
list.add(s4);

Student s5 = new Student("libingbing","shanghai",30,95.0);
list.add(s5);

Student s6 = new Student("wangwu","shanghai",30,85.0);
list.add(s6);

// forEach循環
list.stream().forEach(student -> System.out.println(student));

結果:

Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='lisi', address='shanghai', age=29, score=80.8}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='fanbingbing', address='beijing', age=34, score=70.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}

使用stream.sort排序

System.out.println("----------使用stream和sort根據年齡排序--默認升序----------");
// sort排序:原集合不變,新集合按順序排序
List<Student> sortList1 = list.stream()
    .sorted((a, b) -> a.getAge().compareTo(b.getAge()))
    .collect(Collectors.toList());
sortList1.stream().forEach(s-> System.out.println(s));
System.out.println();

結果:

----------使用stream和sort根據年齡排序--默認升序----------
Student{name='lisi', address='shanghai', age=29, score=80.8}
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='fanbingbing', address='beijing', age=34, score=70.0}

使用stream的sorted排序,根據年齡倒序排序

System.out.println("---------使用stream和sort根據年齡排序--降序排列-----------");
List<Student> sortDesList = list.stream()
    .sorted(Comparator.comparingInt(Student::getAge).reversed())
    .collect(Collectors.toList());
sortDesList.stream().forEach(s-> System.out.println(s));
System.out.println();

結果:

---------使用stream和sort根據年齡排序--降序排列-----------
Student{name='fanbingbing', address='beijing', age=34, score=70.0}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='lisi', address='shanghai', age=29, score=80.8}

使用stream的sorted根據多字段排序,根據年齡降序然後根據分數升序排序。

System.out.println("---------使用steam和sort根據多字段排序");
// 首先根據年齡降序排列,在根據成績升序排序
Stream<Student> sortMoreList = list.stream().sorted(
    Comparator.comparingInt(Student::getAge).reversed()
    .thenComparing(Student::getScore));
sortMoreList.forEach(s-> System.out.println(s));
System.out.println();

結果:

---------使用steam和sort根據多字段排序
Student{name='fanbingbing', address='beijing', age=34, score=70.0}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='lisi', address='shanghai', age=29, score=80.8}

分組排序

System.out.println("--------使用stream和sort分組排序");
// 根據地點進行分組,組內按照分數降序排序;注意,如果此時有多個字段排序是有問題的,也就是說分組後的排序是不準確的。只有一個排序時是沒問題的。
Map<String, List<Student>> sortAndGroupMap = list.stream().sorted(
                    Comparator.comparingDouble(Student::getScore).reversed()
                ).collect(Collectors.groupingBy(Student::getAddress));

sortAndGroupMap.get("shandong").stream().forEach(s-> System.out.println(s));
System.out.println("------------");
sortAndGroupMap.get("beijing").stream().forEach(s-> System.out.println(s));
System.out.println("------------");
sortAndGroupMap.get("shanghai").stream().forEach(s-> System.out.println(s));

結果:

--------使用stream和sort分組排序
Student{name='lining', address='shandong', age=31, score=70.8}
------------
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='fanbingbing', address='beijing', age=34, score=70.0}
------------
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='lisi', address='shanghai', age=29, score=80.8}

使用集合自身sort排序

System.out.println("----------不使用stream和sort------------");
// 使用集合的sort排序,集合自身排序發生變化
list.sort((a,b)->a.getAge().compareTo(b.getAge()));
list.stream().forEach(student -> System.out.println(student));
System.out.println();

結果:

---------不適用stream和sort------------
Student{name='lisi', address='shanghai', age=29, score=80.8}
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='fanbingbing', address='beijing', age=34, score=70.0}

利用stream替換集合中對象的某一屬性值

// list集合某一屬性全部替換固定值
list.stream().forEach(student -> student.setAddress("china"));
System.out.println();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章