2016-08-03 2 views
3

У меня есть некоторый код, как это:Java: не-пустоты методы, как карты значения

public class A { 
    private final Map<String, Runnable> map = new HashMap<>(); 
    public A() { 
     map.put("a",() -> a()); 
     map.put("b",() -> b()); 
    } 
    public int a() { 
     return 1; 
    } 
    public int b() { 
     return 2; 
    } 
    public int c(String s) { 
     // map.get(s).run(); <= returns void, but 
     //      I need the result of the 
     //      function paired to the string. 
     // What TODO? 
    } 
} 

Я не-недействительные функции (a(), b()) в качестве значений отображения, в паре с Strings. Мне нужно запустить функции и получить результат функций и вернуть их в функцию c(). Функция run() возвращает void, поэтому я не могу получить от нее значение. Есть какой-либо способ сделать это?

+0

Что именно вы хотите вернуть с 'c'? 1? 2? Что-то другое? – Tunaki

+0

Например: public static void main (String [] args) { System.out.println (c ("a")); // Печать 1 - результат вызова a() } –

+0

Почему вы не используете пользовательский интерфейс вместо «Runnable»? Но обратите внимание, что это «решение» проблемы, которую вы не обнаружили, выглядит * плохой * IMHO –

ответ

6

Что вы хотите сделать здесь, это вернуть значение int из метода. Для этого вы не можете использовать Runnable, так как run() не возвращает значение.

Но вы можете использовать IntSupplier, который представляет собой функциональный интерфейс, представляющий функцию, снабженную значением int. Его функциональный метод getAsInt используется для возврата значения.

public class A { 
    private final Map<String, IntSupplier> map = new HashMap<>(); 
    public A() { 
     map.put("a",() -> a()); // or use the method-reference this::a 
     map.put("b",() -> b()); // or use the method-reference this::b 
    } 
    public int a() { 
     return 1; 
    } 
    public int b() { 
     return 2; 
    } 
    public int c(String s) { 
     return map.get(s).getAsInt(); 
    } 
} 

Кроме того, если вы не хотите, чтобы вернуть примитивный, но объект MyObject, вы можете использовать функциональный интерфейс Supplier<MyObject> (или Callable<MyObject> если метод для вызова может бросить проверяемое исключение).

+0

Спасибо! Но, похоже, я слишком упростил свою проблему - есть ли какое-то решение, где я могу это сделать, возвращая не int, а собственный тип из класса, который я создал? –

+0

И если у меня есть больше типов для возврата - могу ли я как-то использовать что-то, что было бы как Поставщик ? –

+0

@DisplayName Лучшее, что вы могли бы сделать, это «Поставщик », если они не разделяют иерархию типов (наименьшая верхняя граница типов). – Tunaki

0

Тот факт, что лямбды являются новыми, не означает, что они необходимы для каждого (возможно, любого) решения. Рассмотрим эту проверенную и корректную функцию java 5 (немного что-то называемое перечисляющими объектами).

public class Enumery 
{ 
    private static enum Stuffs 
    { 
     a(1), 
     b(2); 

     Stuffs(final int value) 
     { 
      this.value = value; 
     } 

     public int kapow() 
     { 
      return value; 
     } 

     final int value; 
    } 

    public int thing(final String stuffsName) 
    { 
     final int returnValue; 
     final Stuffs theStuffs; 

     theStuffs = Stuffs.valueOf(stuffsName); 

     returnValue = theStuffs.kapow(); 

     return returnValue; 
    } 
} 
Смежные вопросы