按条件多字段自定义排序.stream().sorted
时间: 2023-07-21 12:04:35 浏览: 335
您可以使用Java 8中的Stream的sorted()方法来按照多个字段进行自定义排序。下面是一个示例代码:
```java
List<Person> persons = ...; // 假设这是一个Person对象列表
List<Person> sortedPersons = persons.stream()
.sorted(Comparator.comparing(Person::getField1)
.thenComparing(Person::getField2)
.thenComparing(Person::getField3))
.collect(Collectors.toList());
```
在这个示例中,我们假设Person对象有三个字段:field1,field2和field3。我们使用sorted()方法,并传入一个Comparator对象来定义排序规则。Comparator.comparing()方法接受一个Function来提取比较的字段。然后,我们可以使用thenComparing()方法来定义多个字段的排序顺序。
请根据您的具体需求修改示例代码中的字段和排序规则。
相关问题
stream sorted 按照某一字段自定义规则排序,如以Name字段排序,内容为off的大于内容为no的
可以使用 Java 8 的 Stream API 中的 sorted 方法,结合 Comparator 接口实现自定义排序规则。具体实现可以参考以下代码:
List<Data> dataList = new ArrayList<>();
// 添加数据到 dataList 中
Comparator<Data> comparator = Comparator.comparing(Data::getName, (name1, name2) -> {
if ("off".equals(name1) && !"off".equals(name2)) {
return -1;
} else if (!"off".equals(name1) && "off".equals(name2)) {
return 1;
} else {
return name1.compareTo(name2);
}
});
List<Data> sortedList = dataList.stream().sorted(comparator).collect(Collectors.toList());
其中,Data 是数据对象,getName() 方法返回 Name 字段的值。Comparator.comparing() 方法用于指定按照哪个字段排序,第二个参数是一个 Lambda 表达式,用于实现自定义排序规则。在这个 Lambda 表达式中,如果 name1 的值为 "off",而 name2 的值不是 "off",则返回 -1,表示 name1 应该排在 name2 前面;如果 name1 的值不是 "off",而 name2 的值是 "off",则返回 1,表示 name1 应该排在 name2 后面;否则,按照默认的字符串比较规则进行排序。最后,使用 collect(Collectors.toList()) 方法将排序后的数据转换成 List。
stream sorted 按照某一字段自定义规则排序,如以Name字段排序,内容为FATAL的大于内容为ERROR的,内容为ERROR的大于内容为WARN的
可以使用Java 8的Stream.sorted方法,结合Comparator.comparing和Comparator.thenComparing方法来实现自定义规则排序。具体实现如下:
```
List<Log> logs = ...; // 假设logs是一个Log对象的列表
logs.stream()
.sorted(Comparator.comparing(Log::getName)
.thenComparing((log1, log2) -> {
if (log1.getMessage().equals("FATAL")) {
return -1;
} else if (log2.getMessage().equals("FATAL")) {
return 1;
} else if (log1.getMessage().equals("ERROR")) {
return -1;
} else if (log2.getMessage().equals("ERROR")) {
return 1;
} else {
return log1.getMessage().compareTo(log2.getMessage());
}
}))
.forEach(System.out::println);
```
这段代码会按照Log对象的Name字段进行排序,如果Name相同,则按照自定义规则进行排序。具体规则是:内容为FATAL的Log排在前面,内容为ERROR的Log排在其次,内容为WARN的Log排在最后。
阅读全文