stream 取 集合里最大日期
时间: 2024-12-14 22:21:10 浏览: 4
在Java中,如果你有一个集合(如List或Set)包含Date类型的元素,并想找到其中的最大日期,你可以使用Stream API来简化这个过程。首先,你需要将集合转换为Stream流,然后可以使用`max()`函数并提供一个Comparator来比较日期。
这是一个示例:
```java
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
public Date getMaxDate(List<Date> dates) {
return dates.stream()
.max(Comparator.comparing(Date::compareTo))
.orElse(null); // 返回集合为空时的默认值,这里通常为null
}
```
在这个例子中,`Date::compareTo`是一个lambda表达式,它告诉`max()`方法如何比较两个日期。`orElse(null)`是为了处理空列表的情况。
相关问题
现有如下几个字符串:a|b|类型1|c|2023-06-05;a|b|类型1|c|2023-06-06;a|b|类型2|c|2023-06-05;现需要按类型分组,且如果一个类型有多个只取最近日期的,返回结果是一个List集合,请用Stream流处理
好的,根据您的要求,我可以给出以下的Java 8 Stream流的处理方式:
```java
List<String> strings = Arrays.asList("a|b|类型1|c|2023-06-05", "a|b|类型1|c|2023-06-06", "a|b|类型2|c|2023-06-05");
List<String> result = strings.stream()
.map(s -> s.split("\\|")) // 将每个字符串按 "|" 分割为字符串数组
.collect(Collectors.groupingBy(
s -> s[2], // 按照类型分组
Collectors.maxBy(Comparator.comparing(s -> s[4])) // 取日期最大的那个字符串
))
.values().stream()
.map(Optional::get) // 将 Optional<String[]> 转为 String[]
.map(s -> String.join("|", s)) // 将字符串数组按 "|" 连接为字符串
.collect(Collectors.toList());
System.out.println(result); // 输出结果:[a|b|类型1|c|2023-06-06, a|b|类型2|c|2023-06-05]
```
以上代码将字符串列表 `strings` 转为一个 `Stream` 流,然后使用 `map` 操作将每个字符串按 "|" 分割为字符串数组,接着使用 `Collectors.groupingBy` 方法按照类型分组,每组中使用 `Collectors.maxBy` 方法取日期最大的那个字符串,最后使用 `values` 方法取出所有的值,使用 `map` 操作将 `Optional<String[]>` 转为 `String[]`,再使用 `map` 操作将字符串数组按 "|" 连接为字符串,最终使用 `Collectors.toList` 方法将结果收集为一个列表。
stream流处理BigDecimal
使用stream流处理BigDecimal的方法有几种常规计算方式。首先,可以使用distinct()和count()方法来统计去重计数。例如,对一个对象列表进行去重计数可以使用以下代码:
list.stream().filter(o -> o.getName() != null).map(object::getName).distinct().count();
另外一种常见的方式是使用reduce()方法进行累加。对一个对象列表中的某个字段进行累加可以使用以下代码:
list.stream().filter(o -> o.getElecutionTime() != null).map(object::getElecutionTime).reduce(BigDecimal.ZERO, BigDecimal::add);
如果返回值是int类型,可以直接使用sum()方法进行求和。例如,对一个学生对象列表中的某个字段进行求和可以使用以下代码:
list.stream().filter(o -> o.getCount() != null).mapToInt(Student::getCount).sum();
还可以使用max()方法来取最大值。例如,对一个对象列表中的某个字段取最大值可以使用以下代码:
list.stream().filter(o -> o.getMaxPeakLoad() != null).map(Object::getMaxPeakLoad).max(BigDecimal::compareTo).orElse(new BigDecimal("0"));
此外,还可以使用filter()方法进行简单的过滤,然后使用findFirst()方法找到第一个匹配的对象。例如,从一个对象列表中找到某个字段值与指定值相等的对象,并获取其结束日期可以使用以下代码:
orgOneEvaluations.stream().filter(item -> maxLoad.equals(item.getMaxPeakLoad())).findFirst().orElse(new OrgOneEvaluation()).getEndDate();
另外,还可以通过使用反射技术将实体类转换成map的方式进行处理。这种方法可以将对象的字段名作为key,字段值作为value放入map中。例如,可以使用以下代码将一个对象转换成map:
private static Map<String, BigDecimal> objectToMap(Object obj) {
Map<String, BigDecimal> map = new HashMap<>();
if (obj == null) {
return map;
}
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
try {
for (Field field : fields) {
field.setAccessible(true);
if (field.get(obj) != null) {
map.put(field.getName(), (BigDecimal) field.get(obj));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
} [2,3]
注意,以上代码中的BigDecimal类型对null值不友好,如果需要保留null值,则可以去除判空逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [map集合-stream流-BigDecimal](https://blog.csdn.net/weixin_44696435/article/details/126008713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文