Java Lambda表达式函数编程

Java Lambda表达式函数编程,java,regex,lambda,functional-programming,Java,Regex,Lambda,Functional Programming,我必须用lambda表达式为大学编写正则表达式。我在一个方法中遇到了两种方法 这是我的密码: static String ausdruck = "abcd"; public static Function<String, String> Char = (c) -> { return (ausdruck.startsWith(c)) ? ausdruck = ausdruck.substring(1, ausdruck.length()) : "

我必须用lambda表达式为大学编写正则表达式。我在一个方法中遇到了两种方法

这是我的密码:

static String ausdruck = "abcd";

public static Function<String, String> Char = (c) -> {
    return (ausdruck.startsWith(c)) ? ausdruck = ausdruck.substring(1,
            ausdruck.length()) : "Value Error";
};

public static BiFunction<Function<String, String>, 
                         Function<String, String>, 
                         Function<String, String>> 
                And = (f1, f2) -> {return null;};

如果我正确理解了这个问题,您需要创建一个函数来组成一个新函数,用另一个函数的结果执行一个函数。在lambda中执行此操作的最佳方法是返回一个新的lambda

试着这样做:

BiFunction<Function<String, String>, Function<String, String>, Function<String, String>> compose =
            (f1, f2) -> (a -> f2.apply(f1.apply(a)));
输出为
sh


最后,如果您想将其用于除
字符串
以外的任何其他对象,那么将
组合
作为实际方法而不是lambda可能是有意义的,这样您就可以使用泛型了。此外,通过使用
,您可以使这一点变得更简单:

public static <A, B, C> Function<A, C> compose(Function<A, B> f1, Function<B,C> f2){
    return f1.andThen(f2);
}
公共静态函数组合(函数f1,函数f2){
返回f1。然后返回(f2);
}

我想这就是你想要的

    Func<Str,Str> f = and( comsume("a"), consume("b") );
    f.apply("abcd"); // "cd"


Func<Str,Str> consume(String x)
    return input->{ 
        if(input.startsWith(x)) return input.substring(x.length());
        else throws new IllegalArgument()
    };


Func<Str,Str> and(Fun<Str,Str> f1, Func<Str,Str> f2)
    return input-> f2.apply(f1.apply(input))
不幸的是,没有“咖喱”;否则,我们可以这样做

    f = consume2.curry("a") .andThen (  consume2.curry("b") );

static BiFunc<Str,Str,Str> consume2 = (input,x)-> {...return input.substring(x.length()); ..

我不认为修改lambda中的静态变量是个好主意。。。我甚至不知道这是否被允许。另外,
Char.apply(“a”)
不会返回另一个函数。
public static <A, B, C> Function<A, C> compose(Function<A, B> f1, Function<B,C> f2){
    return f1.andThen(f2);
}
    Func<Str,Str> f = and( comsume("a"), consume("b") );
    f.apply("abcd"); // "cd"


Func<Str,Str> consume(String x)
    return input->{ 
        if(input.startsWith(x)) return input.substring(x.length());
        else throws new IllegalArgument()
    };


Func<Str,Str> and(Fun<Str,Str> f1, Func<Str,Str> f2)
    return input-> f2.apply(f1.apply(input))
    f = consume("a").andThen( consume("b) )
    f = consume2.curry("a") .andThen (  consume2.curry("b") );

static BiFunc<Str,Str,Str> consume2 = (input,x)-> {...return input.substring(x.length()); ..
interface F1
    String apply(String);
    F1 and(F1);

interface F2
    String apply(String,String);
    F1 curry(String);