I've seen a few questions related to this, but I need a clear answer. I do understand the context where lambda expressions run, and the concept of side effects, but I believe there is a workaround I'm not seeing here.
I need to map a list of personas based on their sex, but the method I use to determine their sex returns a checked exception, which is not something the Collectors.groupingBy likes, at all.
Getting rid of the checked exception is not an option, and I need to send it up to the client method who invoked my piece of code. I there anything I can do around it?
public class Example {
  public static void main(String[] args) {
    Example example = new Example();
    try {
        example.runExample();
    } catch (MException e) {
        //Place where I want to handle the exception
    }
  }
  private void runExample() throws MException{
    List<Person> personas = Arrays.asList(new Person("Sergio", "234456789", 35), new Person("Mariana", "123456789", 38));
    Map<String, List<Person>> personsBySex = personas.stream().collect(Collectors.groupingBy(persona -> {
        try {
            return getSex(persona.getSSN());
        } catch (MException e) {
        }
        return null; 
        //Compiler forces me to return a value, but I don't want to return null. 
        //I want to throw up the MException to the client method (main)
    }));
  }
  private String getSex(String ssn) throws MException {
    // Imagine here is a call to an outside service that would give me the
    // sex based on the SSN, but this service could return an exception as
    // well
    if (ssn.isEmpty())
        throw new MException();
    return ssn.startsWith("1") ? "Female" : "Male";
  }
}
class Person {
  private String name, ssn;
  private Integer age;
  public Person(String name, String ssn, Integer age) {
    this.name = name;
    this.ssn = ssn;
    this.age = age;
  }
  public String getName() {return name;}
  public String getSSN() {return ssn;}
  public Integer getAge() {return age;}
}
class MException extends Exception {
}
Thanks for any ideas!
 
     
     
    