Java Collectors.groupingBy用于可选字段';内场
我想将一条流映射到类似于Java Collectors.groupingBy用于可选字段';内场,java,java-stream,Java,Java Stream,我想将一条流映射到类似于map的映射,其中Car类如下: public class Car<T> { Optional<T> studentInGroup; public Car() { } public Optional<T> getStudentInGroup() { return studentInGroup; } public void setStudentInGroup(
map
的映射,其中Car
类如下:
public class Car<T> {
Optional<T> studentInGroup;
public Car()
{
}
public Optional<T> getStudentInGroup() {
return studentInGroup;
}
public void setStudentInGroup(T studentInGroup) {
this.studentInGroup=Optional.of(studentInGroup);
}
}
因此,我想基于studenGroup
的name字段构建一个地图,如果车内的可选的不是可选的.empty()
,而我想用“none”替换它,如果在特定的cat中studenGroup字段等于可选的.empty()
Map stringstudentingroupmap 38=studentInGroupStreamSupplier.get().Map((StudentInGroup StudentInGroup)->{Car Car Car=new Car();Car.setStudentInGroup(StudentInGroup);return Car;}.collector(Collectors.groupingBy(Car->Car->Car.getStudentInGroup().orelsget(…在那里与学生做点什么)。getName())
可能的解决方案是创建“none containing StudentingGroup”,其getName将返回所需的数据,虽然这看起来不是正确的方法。但是,<我没有找到任何方法来保留原始流
,而不将其映射到其他流,并强制在Car.studentingGroup.Name或“none”上分组如果Optional
为空。欢迎您提供清晰易读的编码建议!只需使用groupingBy()
收集器并映射Optional
即可获取密钥:
Map<String, List<Car<StudentInGroup>>> byName = cars.stream()
.collect(Collectors.groupingBy(
car -> car.getStudentInGroup()
.map(s -> s.getName())
.orElse("none")))
Map byName=cars.stream()
.collect(收集器.groupingBy(
car->car.getstudentinggroup()
.map(s->s.getName())
.orElse(“无”))
Stream
是一种原始类型。它不应该是Stream
吗?如果是这样,只需执行cars.Stream().collect(Collectors.groupby(car->car.getstudentinggroup().map(s->s.getName())或lse(“none”))
@Deadpool过滤器无法工作,因为我希望将空选项包括在地图中too@shmosel好idea@shmosel请将你的答案作为官方答案发布,这对我很有效!
Map<String, List<Car<StudentInGroup>>> stringStudentInGroupMap38= studentInGroupStreamSupplier.get().map((StudentInGroup studentInGroup)->{Car<StudentInGroup> car=new Car<StudentInGroup>();car.setStudentInGroup(studentInGroup);return car;}).collect(Collectors.groupingBy(car->car.getStudentInGroup().orElseGet(... do something with student there).getName())
Map<String, List<Car<StudentInGroup>>> byName = cars.stream()
.collect(Collectors.groupingBy(
car -> car.getStudentInGroup()
.map(s -> s.getName())
.orElse("none")))