2016-12-18 6 views
3

문자열 값을 기반으로 메서드 포인터를 맵에 저장하여 실행하려고합니다. Аrom 내가 찾은, 나는 그것을 할 Map<String, Runnable> 사용할 수 있지만 문제는 메서드에서 반환 값을 얻고 싶습니다.java 8 - HashMap에 메서드를 저장하고 맵에서 메서드의 반환 값을 가져옵니다.

private Map<String, Runnable> timeUnitsMap = new HashMap<String, Runnable>() {{ 
    timeUnitsMap.put("minutes",() -> config.getMinutesValues()); 
}} 

방법 config.getMinutesValues() 다른 클래스에서입니다 :

내가 이런 걸 말해봐.

지도에서 함수 값을 얻으려면 대신 int value = timeUnitsMap.get("minutes").run();을 저장하거나지도에 다른 것을 저장하려면 어떻게해야합니까?

+1

-> config.getMinutesValues ​​()','config :: getMinutesValues'를 쓸 수 있다는 것을 알고 있습니까? – Sam

답변

6

Runnable 값을 반환하지 않습니다. 대신 Supplier 또는 Callable을 사용해야합니다.

가장 큰 차이점은 SupplierCallable입니다. Callable은 체크 예외를 발생시킬 수 있습니다. 그런 다음 Callable을 사용하는 모든 곳에서 예외의 가능성을 처리해야합니다. Supplier은 사용 사례에 따라 더 간단합니다.

Map<String, Runnable>Map<String, Supplier<Integer>>으로 변경해야합니다. 람다 함수 자체는 변경 될 필요가 없습니다.

@assylias는 Map<String, IntSupplier>을 사용할 수도 있다는 의견을 지적했습니다. IntSupplier을 사용하면 intInteger으로 복싱하지 않아도됩니다.

+1

또는이 특정 경우에'IntSupplier '가능성이 더 높습니다. – assylias

+1

@assylias 좋은 아이디어! 그건 나에게 일어난 일이 아니었다. 너의 대답에 대해 – Sam

+0

고마워. 나는 원래 질문을 편집 한 다른 질문이있다. 당신의 대답을 고맙게 여길 것입니다. –

0

Runnable 대신 Callable을 사용해야하고 call() 메소드를 재정의해야합니다.

당신은 다음 코드에서 실마리를 얻을 수 있습니다 :

private Map<String, Callable<Integer>> timeUnitsMap = new HashMap<String, Callable<Integer>>(){ 
     {timeUnitsMap.put("minutes",() -> call());}}; 

를하고() 메서드 호출도를 오버라이드 (override) 할 필요가, 대신`()의

@Override 
    public Integer call() throws Exception { 
     return 1; 
}