java - 从列表生成列表
问题描述
我一直在四处寻找,但找不到一种拆分列表的聪明方法。
假设我们有以下示例:
public class Person {
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
// Getters/setters
}
那么我有:
List<Person> personList = new ArrayList<>();
personList.add(new Person("Adam", 30, "male"));
personList.add(new Person("John", 32, "male"));
personList.add(new Person("Monica", 30, "female"));
personList.add(new Person("Sophia", 20, "female"));
personList.add(new Person("Carol", 25, "female"));
有没有一种方法可以使用 Stream API 对男性和女性进行分组来生成两个新的 Person 列表?
解决方案
如果我是你,我会将其流式传输List
并用于Collectors.partitioningBy
将其收集到Map<Boolean, List<Person>>
雄性true
(或false
)所在的位置,而雌性与雄性相反。就像下面这样简单:
personList.stream()
.collect(Collectors.partitioningBy(person -> "male".equals(person.getGender())));
打印这将返回以下内容(实施后Person#toString
):
{false=[Person [Name: Monica, Age: 30, Gender: female], Person [Name: Sophia, Age: 20, Gender: female], Person [Name: Carol, Age: 25, Gender: female]], true=[Person [Name: Adam, Age: 30, Gender: male], Person [Name: John, Age: 32, Gender: male]]}
推荐阅读
- javascript - 在所有 siutes 之后如何运行 cy.task
- ios - 在路径数据模型或其他问题的情况下如何遵循干净的代码规则
- delphi - 如何从 TStyleBook 对象运行时更改样式书的样式资源属性
- javascript - 在 chrome 扩展的 background.js 中使用 npm run build 调用 JS 函数
- sql - DATEDIFF() 用于动态更改日期
- xamarin - 如何在 Xamarin Android 中实现本地推送通知
- r - 按多个因素对表格进行分组并将其从长格式扩展到宽格式 - R 中的 data.table 方式
- mysql - 如何在 union all 中使用 order by
- angular - 无法在 Angular Universal 应用程序中使用 https 访问 localhost
- javascript - 在 jquery 中将创建的日期时间字符串格式化为 00:00:00