Цепочка операций - PullRequest
0 голосов
/ 27 июня 2018

У меня есть интерфейс, который принимает строку и возвращает преобразованную строку

У меня есть несколько классов, которые будут трансформироваться по-разному. Есть ли способ в Java для создания потока этих классов и преобразования строки.

Например:

class MyClass implements MyOperation {
   String execute(String s) { return doSomething(s); }
}

class MyClass2 implements MyOperation {
   String execute(String s) { return doSomething(s); }
}

ArrayList<MyClass> operations = new ArrayList<>();

operations.add(new MyClass());
operations.add(new MyClass2());
...

operations.stream()...

Могу ли я создать поток для того, чтобы сделать много преобразований для одной строки? Я думал о .reduce(), но это строго по типам данных.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Все ваши классы реализуют методы, которые преобразуют String в String. Другими словами, они могут быть представлены Function<String,String>. Их можно объединить следующим образом и применить к одной строке:

List<Function<String,String>> ops = new ArrayList<> ();
ops.add (s -> s + "0"); // these lambda expressions can be replaced with your methods:
                        // for example - ops.add((new MyClass())::execute);
ops.add (s -> "1" + s);
ops.add (s -> s + " 2");
// here we combine them
Function<String,String> combined = 
    ops.stream ()
       .reduce (Function.identity(), Function::andThen);
// and here we apply them all on a String
System.out.println (combined.apply ("dididi"));

Выход:

1dididi0 2
0 голосов
/ 27 июня 2018

ArrayList<MyClass> должно быть ArrayList<MyOperation>, иначе вызов operations.add(new MyClass2()); приведет к ошибке компиляции.

Тем не менее, вы ищете эту перегрузку reduce:

String result = operations.stream().reduce("myString",
                (x, y) -> y.execute(x),
                (a, b) -> {
                    throw new RuntimeException("unimplemented");
                });
  • "myString" - это значение идентификатора.
  • (x, y) -> y.execute(x) - применяемая функция аккумулятора.
  • (a, b) -> {... - функция объединителя, используемая только тогда, когда поток параллелен . Так что вам не нужно беспокоиться об этом для последовательного потока.

    Вы также можете прочитать ответ, который я недавно опубликовал "Функция дешифрования потока" .

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