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")))