【发布时间】:2021-02-06 17:42:29
【问题描述】:
我有一个简单的练习代码,其中有一个简单的 Person 对象列表。
我想做的是根据他们的年龄是奇数的偶数来划分他们,然后如果他们属于偶数组,则将他们的名字转换为大写,否则将名字转换为小写。
我面临的困难是使用 collect() 操作执行此转换。
这是简单的人类
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@AllArgsConstructor
@Data
@Builder
@NoArgsConstructor
public class Person {
private String name;
private Gender gender;
private int age;
@Override
public String toString() {
return String.format("%s -- %s -- %d", name, gender, age);
}
}
这是一个简单的 Person 对象列表
public static List<Person> getExpandedList() {
return Arrays.asList(new Person("Sara", Gender.FEMALE, 20), new Person("Sara", Gender.FEMALE, 22),
new Person("Bob", Gender.MALE, 20), new Person("Paula", Gender.FEMALE, 32),
new Person("Paul", Gender.MALE, 31), new Person("Jack", Gender.MALE, 2),
new Person("Jack", Gender.MALE, 72), new Person("Jill", Gender.FEMALE, 12),
new Person("Mahi", Gender.FEMALE, 11), new Person("Natalie", Gender.FEMALE, 3));
}
以下是我尝试用于转换的代码。
所以我希望 Mahi、Natalie 和 Paul 的名字全部小写,其余的名字全部大写,我希望整个人都返回对象,而不仅仅是名字。
这是我正在尝试的代码
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.*;
public class PartitioningWithCollectors {
public static void main(String[] args) {
List<Person> personList = StreamsPracticeUtil.getExpandedList();
Map<Boolean, List<Person>> updatedPersons = personList.stream()
.collect(partitioningBy(person -> person.getAge() % 2 == 0,
//filtering(person -> person.getAge() % 2 == 0,
mapping(person -> Person.builder()
.age(person.getAge())
.gender(person.getGender())
.name(person.getName().toUpperCase())
.build(), toList())));//);
System.out.println(updatedPersons);
}
}
当然,问题是一旦我使用任何类型的过滤,分区的其他结果就消失了。
实际上我想以一种功能性的方式执行以下操作
for (Person person : personList) {
if (person.getAge() % 2 == 0) {
person.setName(person.getName().toUpperCase());
} else {
person.setName(person.getName().toLowerCase());
}
}
System.out.println(personList);
感谢我能得到的任何帮助。谢谢..!!
【问题讨论】:
标签: java java-stream collect