java 8 stream 多字段排序

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(2488)   2023-03-28 11:29:14
本例子主要使用stream进行多个字段的排序,使用了 comparators和Comparator.thenComparing()方法。比较器之间返回一个字典排序。他的排序效果有点像SQL中的group by条件。

1.创建一个多字段排序的比较器

想要使用Java 8的Stream进行多字段排序,首先我们需要对我们想要排序的字段及那些创建comparator。然后根据需求进行一个链式的排序顺序,以此来完成类似group by的排序效果。

如何创建比较器comparator:
//姓的比较器comparator
Comparator<Employee> compareByFirstName = Comparator.comparing( Employee::getFirstName );
 
//最后一个名字的比较器 comparator
Comparator<Employee> compareByLastName = Comparator.comparing( Employee::getLastName );
 
//比较第一个名字然后比较最后一个名字 (多字段)
Comparator<Employee> compareByFullName = compareByFirstName.thenComparing(compareByLastName);
 
//使用比较器Comparator - 伪代码
list.stream().sorted( comparator ).collect();

2. java 8 stream 多字段排序

排序例子:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
 
public class Main
{
    public static void main(String[] args)
    {
        ArrayList<Employee> employees = getUnsortedEmployeeList();
         
        //先比较姓然后比较名
        Comparator<Employee> compareByName = Comparator
                                                .comparing(Employee::getFirstName)
                                                .thenComparing(Employee::getLastName);
         
        List<Employee> sortedEmployees = employees.stream()
                                        .sorted(compareByName)
                                        .collect(Collectors.toList());
         
        System.out.println(sortedEmployees);
    }
 
    private static ArrayList<Employee> getUnsortedEmployeeList()
    {
        ArrayList<Employee> list = new ArrayList<>();
        list.add( new Employee(2l, "Lokesh", "Gupta") );
        list.add( new Employee(1l, "Alex", "Gussin") );
        list.add( new Employee(4l, "Brian", "Sux") );
        list.add( new Employee(5l, "Neon", "Piper") );
        list.add( new Employee(3l, "David", "Beckham") );
        list.add( new Employee(7l, "Alex", "Beckham") );
        list.add( new Employee(6l, "Brian", "Suxena") );
        return list;
    }
}

运行项目输出结果:
$title(Console)
[E[id=7, firstName=Alex,    lastName=Beckham],
E [id=1, firstName=Alex,    lastName=Gussin],
E [id=4, firstName=Brian,   lastName=Sux],
E [id=6, firstName=Brian,   lastName=Suxena],
E [id=3, firstName=David,   lastName=Beckham],
E [id=2, firstName=Lokesh,  lastName=Gupta],
E [id=5, firstName=Neon,    lastName=Piper]]

上方输出结果表示已经实现多字段的字典排序,如果你有任何疑问欢迎在下面的评论区留言告诉我。

 
地址:https://www.leftso.com/article/612.html

相关阅读

java 8 stream 多字段排序,本例子主要使用stream进行多个字段的排序,使用了 comparators和Comparator.thenComparing()方法。比较器之间返回一个...
本文主要讲解通过使用 Stream.concat() 方法 去合并两个stream,新的stream由原来的两个stream所有元素组成(相同元素会覆盖)
简介本博文主要讲解在Java 8中 如何通过stream流的方式去重
Java 8使用多个comparators进行集合分组排序
javastreamList根据对象某个属性升序或降序排序代码参考;publicclassMyTests{@NoArgsConstructor@AllArgsConstructor@Datapu...
取出属性为集合List&lt;String&gtl; stateNameList = dictEntityList.stream().map(DictEntity::getName).colle...
Java stream 筛选集合中的唯一对象出来演示数据模型@AllArgsConstructor @NoArgsConstructor @Data public class UserInfo ...
//声明一个List集合List&lt;Person&gtl; list = new ArrayList();           list.add(new Person("1001", "小A...
java stream 按月(日期Date)分组统计首先是上一个简单的数据模型@Data @NoArgsConstructor @AllArgsConstructor public class ...
jdk8新特性流的使用