使用list.stream().filter()过滤出某个字段的最小值
时间: 2023-07-21 08:28:50 浏览: 66
假设我们有一个包含对象的列表,每个对象都有一个整数字段 `value`。我们可以使用 `list.stream().mapToInt()` 将对象转换为整数流,然后使用 `min()` 方法找到最小值。以下是一个示例代码:
```
int minValue = list.stream()
.mapToInt(obj -> obj.getValue()) // 将对象转换为整数流
.min() // 找到最小值
.orElse(0); // 如果列表为空,则返回默认值
```
这段代码首先将对象列表转换为整数流,然后找到该流的最小值。如果列表为空,则默认值为 0。你可以将 `orElse()` 方法中的默认值更改为任何你想要的值。
相关问题
list.stream.filter 根据某个字段去重
您好!要根据List中的某个字段进行去重和筛选,可以使用Java 8中的Stream API中的filter和distinct方法。
假设我们有一个List<User>,每个User对象包含id和name属性,现在要根据id属性进行去重和筛选,可以使用以下代码:
```
List<User> userList = ...; // 假设我们已经有了一个List<User>对象
List<User> distinctList = userList.stream()
.filter(distinctByKey(User::getId))
.collect(Collectors.toList());
```
上面的代码中,我们使用了Stream的filter()方法和自定义的distinctByKey()方法。distinctByKey()方法的实现如下:
```
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
```
这个方法会根据传入的keyExtractor函数提取User对象的id属性,并使用ConcurrentHashMap来记录已经出现过的id值。如果当前id值是第一次出现,那么就返回true,否则返回false。这个方法会作为filter()方法的参数,用于筛选不重复的User对象。
需要注意的是,这种方法使用了ConcurrentHashMap来记录已经出现过的id值,因此可以在多线程环境下使用。如果您的应用程序是单线程的,可以使用普通的HashMap来代替ConcurrentHashMap。
list.stream.filter模糊过滤
对于模糊过滤,你可以使用 `filter` 方法配合匿名函数来实现。假设你有一个字符串列表 `list`,你想要过滤出其中包含特定子串的元素,可以按照以下方式使用 `filter` 方法:
```java
List<String> filteredList = list.stream()
.filter(str -> str.contains("特定子串"))
.collect(Collectors.toList());
```
其中,`str -> str.contains("特定子串")` 是一个匿名函数,用于判断字符串是否包含特定子串。`filter` 方法会保留返回值为 `true` 的元素,最后使用 `collect` 方法将过滤后的元素收集到新的列表中。
你可以根据实际需求修改上述代码中的 "特定子串" 部分,以适应不同的模糊过滤条件。