2015-10-25 5 views
0

У меня есть следующий вопрос: мне нужно написать один метод, который будет принимать переменное количество аргументов Function и, на его основе, вернет необходимый тип. Проблема заключается в том, что функции от аргументов выполняются в следующем порядке:Значение аргумента переменной (типа функции) и тип возвращаемого значения переменной

public class Main { 
    public static void main(String[] args) throws Exception { 

    //Lambda expressions which will be taken as arguments in method. 

    Function<String,List<String>> flines = e->{ 
    }; 
    Function<List<String>,String> join = e ->{ 
    }; 
    Function<String,List<Integer>> collectInts = e->{ 
    }; 
    Function<List<Integer>,Integer> sum = e->{ 
    }; 

    // end of lambdas 

    String fname = System.getProperty("C:/LamComFile.txt"); 
    InputConverter<String> fileConv = new InputConverter<>(fname); 
    List<String> lines = fileConv.convertBy(flines); 
    String text = fileConv.convertBy(flines, join); 
    List<Integer> ints = fileConv.convertBy(flines, join, collectInts); 
    Integer sumints = fileConv.convertBy(flines, join, collectInts, sum); 

    System.out.println(lines); 
    System.out.println(text); 
    System.out.println(ints); 
    System.out.println(sumints); 

    List<String> arglist = Arrays.asList(args); 
    InputConverter<List<String>> slistConv = new InputConverter<>(arglist); 
    sumints = slistConv.convertBy(join, collectInts, sum); 
    System.out.println(sumints); 

    } 
} 

Как Вы можете видеть, мне нужно создать класс, который будет иметь один метод (перегрузка не допускается) и на основе какой то метод получит, он должен вернуть правильный тип.

У меня есть начало класса InputConverter, но я не знаю, как заставить следующие функции получить аргументы из предыдущих.

public class InputConverter<T> { 
     private T obj; 

     public InputConverter(T obj) { 
      this.obj = obj; 
     } 

     public <what goes here?> and_here convertBy(Function<In,Out>... funcs){ 

     } 
    } 

Я предполагаю, что могу сделать что-то подобное?

if(funcs.length()==1){ 
    what? = funcs[0].apply(this.obj); 
    return what? 
} 
+1

[I] (http://stackoverflow.com/questions/33256485/) [чувствовать себя] (http://stackoverflow.com/questions/33298519/) [déjà vu] (http://stackoverflow.com/вопросы/33259637 /). Вы все в одном классе? Это назначение - вздор. – Holger

+0

Невозможно использовать varargs, чтобы выразить, что последовательные типы должны совпадать. Вы можете сделать 'convertBy (Function ... funcs)', но тогда вы потеряете всю безопасность типов. Я согласен, что это очень странное задание. –

+0

@Holger: Похоже, я не был первым в этом задании (1,2 из ваших хитов правильные) - его половина учебного года, другая, вероятно, получит это смешное задание завтра. Я знаю это, вы знаете, что почти все это знают. Кроме того, часть, где вы не можете перегружать методы, была добавлена ​​как несколько дней назад, в начале ее не было. – uacnix

ответ

4

Вы не можете выразить это в системе типа Java. Примите потребность в чем-то еще. Например, вы можете просто написать f1.andThen(f2).andThen(f3).andThen(f4)....

+0

Да, дело в том, что я не могу изменить главный файл, кроме секции lambdas. Прямо сейчас у меня есть 4 метода для каждого примера, и он выглядит (также плохим) следующим образом :(public O convertBy (Function flines, Function join ...) – uacnix

Смежные вопросы