Передача нескольких лямбд в качестве параметра метода - PullRequest
1 голос
/ 04 ноября 2019

Я хочу передать несколько лямбда-методов в качестве параметров для метода. Не одна лямбда, но несколько лямбд. Как это сделать?

flines = arg -> arg.startsWith("WAW");

String fname = System.getProperty("user.home") + "/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);
    ...

1 Ответ

1 голос
/ 04 ноября 2019

Я думаю, вам нужно написать метод, тип возвращаемого значения которого зависит от Function -аргумента:

class InputConverter<T> {
   private final T value;

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

    public <R> R convertBy(Function<T, R> function){
        return function.apply(value);
    }
 }

, а затем вы можете комбинировать Function -аргументы, используя стандартные методы compose и andThen:

final String fname = "fname_value"

InputConverter<String> inputConverter = new InputConverter<>(fname);

Function<String, List<String>> valueToListFunction = Arrays::asList;
Function<List<String>, String> firstValueFunction = l -> l.get(0);

List<String> strings = inputConverter.convertBy(valueToListFunction);//[fname_value]
String firstValue = inputConverter.convertBy(
            valueToListFunction
                    .andThen(firstValueFunction)
);

также вы можете использовать другой стандарт FunctionalInterfaces, например UnaryOperator:

UnaryOperator<String> firstChangeFunction = arg -> arg.concat(" + first");
UnaryOperator<String> secondChangeFunction = arg -> arg.concat(" + second");

String firstValue = inputConverter.convertBy(
            valueToListFunction
                    .andThen(firstValueFunction)
                    .andThen(secondChangeFunction)
                    .compose(firstChangeFunction)
); // sout: fname_value + first + second

или написать самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...