运营链

时间:2018-06-27 11:02:08

标签: java java-stream

我有一个接受字符串并返回转换后的字符串的接口

我有一些将以不同方式转换的类。 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 :(得分:3)

您的所有类均实现将String转换为String的方法。换句话说,它们可以用Function<String,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

答案 1 :(得分:2)

ArrayList<MyClass>应该为ArrayList<MyOperation>,否则对operations.add(new MyClass2());的调用将产生编译错误。

那表示您正在寻找this overload of 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) -> {...是仅在流并行时使用的合并器功能。 。因此,您不必担心顺序流。

    您可能还想阅读我前一阵子发布的答案"Deciphering Stream reduce function"