Collectors.groupingBy用于可选字段的内部字段

时间:2019-03-26 20:46:59

标签: java java-stream

我想将流Stream<Car>映射到Map<String, List<Car<StudentInGroup>>>这样的地图,其中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);
    }
}

StudentInGroup就像

public class StudentInGroup {
    private String name;
    private boolean isGirl;
    private int age;
}

因此,我想根据StudenInGroup的名称字段来构建地图,但车内的Optional<StudentInGroup>不是Optional.empty(),而我想用它代替如果在特定的猫中,studentIngroup字段等于Optional.empty(),则为“ none”。

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

可能的解决方案是创建一个“不包含StudentInGroup”,其getName将返回所需的数据,但这种方法看起来不正确。但是<我没有找到任何方法来保留原始Stream<Car>而不将其映射到其他Streams并在Car.StudentInGroup.Name上强制分组,如果Optional<StudenInGroup>为空,则将其强制为“ none”。欢迎提供任何清晰易读的编码建议!

1 个答案:

答案 0 :(得分:3)

只需使用 if slot_value is not in ['accepted', 'values']: prompt = "The slot value is invalid, say something else" return handler_input.response_builder.ask(prompt).add_directive( ElicitSlotDirective( slot_to_elicit=slot_name )).response 收集器并映射groupingBy()即可获取密钥:

Optional