Java 中 stream 留根据某个参数进行去查
时间: 2024-10-08 21:18:58 浏览: 25
在Java中,Stream API是一个强大的功能,它提供了一种高效处理集合数据的方式。如果你想根据某个参数筛选出stream中的元素,可以使用`filter()`方法。这个方法接受一个Predicate(断言函数),用于判断每个元素是否满足给定条件。
例如,假设你有一个Person列表,你想找出所有年龄大于20的人:
```java
List<Person> people = ... // 假设这是已有的Person列表
List<Person> filteredPeople = people.stream()
.filter(person -> person.getAge() > 20)
.collect(Collectors.toList());
```
在这个例子中,`filter(person -> person.getAge() > 20)`就是根据`person.getAge()`方法的返回值(年龄)作为参数,筛选出符合条件(年龄大于20)的人员。
相关问题
stream流中根据某个参数移除重复数据 distubct
在Java Stream API中,`distinct()` 这个操作用于移除集合中的重复元素,但它本身并不关心输入元素的具体内容,而是基于元素的引用去判断是否重复。如果你想根据元素的内容(如某个属性值、对象状态等)来去除重复,你需要自定义一个比较规则或者提供一个函数作为参数。
例如,假设有一个 `Person` 类,你想根据 `name` 属性去除重复,你可以这样做:
```java
List<Person> people = ... // 假设这是包含Person对象的列表
// 使用Lambda表达式指定比较规则,如果两个人的名字不同则认为是唯一的
people.stream()
.distinct(Comparator.comparing(Person::getName))
.collect(Collectors.toList());
```
在这里,`Comparator.comparing(Person::getName)` 创建了一个比较器,它会按照 `Person` 的 `name` 属性来比较元素,只有当两个名字不同时,`distinct()` 才会认为它们是唯一的。
如果你想要删除的是基于某个字段生成的新对象的重复,比如某个映射的键,可以先将对象转化为键(如 `map -> map.getKey()`),然后利用 `distinctBy` 来操作:
```java
Map<String, String> map = ... // 假设是String类型的map
// 使用Lambda表达式去除基于key的重复
map.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue, // 如果有冲突就保留第一个
LinkedHashMap::new // 使用LinkedHashMap保持插入顺序
));
```
java stream流根据对象中的某个属性对集合去重
在Java中,你可以使用`Stream`流对集合中的对象根据某个属性进行去重。以下是一个示例代码:
假设有一个名为`Person`的类,其中包含`name`和`age`属性:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
```
现在有一个`List`类型的对象列表,你可以使用以下代码根据`Person`对象的`age`属性对其进行去重:
```java
List<Person> people = new ArrayList<>();
// 添加一些 Person 对象到列表中
List<Person> distinctPeople = people.stream()
.filter(distinctByKey(Person::getAge))
.collect(Collectors.toList());
// 定义 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;
}
```
以上代码将根据`age`属性对`people`列表进行去重。`distinctByKey`方法接收一个`Function`类型的参数,该参数指定要去重的属性。该方法返回一个`Predicate`类型的对象,它将检查给定的`Person`对象是否已被处理过。如果已处理,`Predicate`将返回`false`,否则将返回`true`。我们使用`ConcurrentHashMap`来记录已处理的对象,以确保线程安全。
请注意,以上代码将返回一个新的`List`对象,该对象只包含不同的`Person`对象。原始的`people`列表不会受到影响。
阅读全文