现有如下几个字符串:a|b|类型1|c|2023-06-05;a|b|类型1|c|2023-06-06;a|b|类型2|c|2023-06-05;现需要按类型分组,且如果一个类型有多个只取最近日期的,返回结果是一个List集合,请用Stream流处理
时间: 2023-08-12 13:29:56 浏览: 179
字符串处理
好的,根据您的要求,我可以给出以下的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` 方法将结果收集为一个列表。
阅读全文