이것과 관련된 몇 가지 질문을 보았습니다 만 명확한 대답이 필요합니다. 나는 lamba 표현식이 실행되는 상황과 부작용의 개념을 이해하지만, 여기서 보지 못하는 해결 방법이 있다고 생각합니다.자바 8 스트림. lamba 표현식의 클라이언트 메소드에 예외를 던집니다.
성별에 따라 페르소나 목록을 매핑해야하지만, 내가 섹스를 결정하는 데 사용하는 방법은 Collectors.groupingBy가 좋아하는 것이 아닌 확인 된 예외를 반환합니다.
확인 된 예외를 제거하는 것은 옵션이 아니므로 코드 조각을 호출 한 클라이언트 메소드로 보내야합니다. 내가 할 수 있는게있어?
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 {
}
어떤 아이디어 주셔서 감사합니다!
[이 질문] (https://stackoverflow.com/questions/27644361/how-can-i-throw-checked-exceptions-from-inside-java -8-streams) 및 그 주석과 대답은 매우 흥미 롭습니다. Tl; dr : 예외를 처리해야하지만 아래의 답변과 연결된 질문 에서처럼 특정 패턴이나 Utils로 패턴을 숨길 수 있습니다. –