Lambda 表达式函数式编程
Lambda Expressions functional programming
我必须为大学编写带有 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;};
我想在 And
方法中做的是: Char(Char.apply("a"))
-> 我想用 f1
作为参数调用函数 f2
。
And 方法的调用必须如下所示:
And.apply(Char.apply("a"), Char.apply("b"));
如果我对这个问题的理解正确,你想创建一个函数来组成一个新函数,执行一个函数并得到另一个函数的结果。在 lambda 中执行此操作的最佳方法是 return 一个新的 lambda。
尝试这样的事情:
BiFunction<Function<String, String>, Function<String, String>, Function<String, String>> compose =
(f1, f2) -> (a -> f2.apply(f1.apply(a)));
示例:
Function<String, String> upper = s -> s.toUpperCase();
Function<String, String> twice = s -> s + s;
Function<String, String> upperTwice = compose.apply(upper, twice);
System.out.println(upperTwice.apply("foo"));
输出为 FOOFOO
。
关于你的具体例子
the Call of the And Method have to look like:
And.apply(Char.apply("a"), Char.apply("b");
我不知道你到底想做什么,但考虑到你目前对 Char
的实施,我认为这不会奏效。似乎您想编写一个 lambda 来删除 a
和另一个删除 b
,但是 Char.apply("a")
不会创建另一个函数,但实际上会从您的 ausdruck
字符串!相反,您的 Char
lambda 可能还应该 return 另一个 lambda,并且该 lambda 不应该修改某些 static
变量,而是 return 另一个 String 参数。
Function<String, Function<String, String>> stripChar =
c -> (s -> s.startsWith(c) ? s.substring(1) : "ERROR");
Function<String, String> stripAandC = compose.apply(stripChar.apply("c"), stripChar.apply("a"));
System.out.println(stripAandC.apply("cash"));
输出为 sh
。
最后,如果你想将它与 String
以外的任何东西一起使用,那么让 compose
成为一个实际的方法而不是 lambda 可能是有意义的,这样你就可以利用仿制药。此外,您可以使用 andThen
:
使这更简单一些
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))
and
不是必需的,参见 Function.andThen
方法
f = consume("a").andThen( consume("b) )
很遗憾,没有"curry";否则,我们可以这样做
f = consume2.curry("a") .andThen ( consume2.curry("b") );
static BiFunc<Str,Str,Str> consume2 = (input,x)-> {...return input.substring(x.length()); ..
如果你设计自己的功能接口,使用像 curry 这样需要的方法,那就更好了。
interface F1
String apply(String);
F1 and(F1);
interface F2
String apply(String,String);
F1 curry(String);
我必须为大学编写带有 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;};
我想在 And
方法中做的是: Char(Char.apply("a"))
-> 我想用 f1
作为参数调用函数 f2
。
And 方法的调用必须如下所示:
And.apply(Char.apply("a"), Char.apply("b"));
如果我对这个问题的理解正确,你想创建一个函数来组成一个新函数,执行一个函数并得到另一个函数的结果。在 lambda 中执行此操作的最佳方法是 return 一个新的 lambda。
尝试这样的事情:
BiFunction<Function<String, String>, Function<String, String>, Function<String, String>> compose =
(f1, f2) -> (a -> f2.apply(f1.apply(a)));
示例:
Function<String, String> upper = s -> s.toUpperCase();
Function<String, String> twice = s -> s + s;
Function<String, String> upperTwice = compose.apply(upper, twice);
System.out.println(upperTwice.apply("foo"));
输出为 FOOFOO
。
关于你的具体例子
the Call of the And Method have to look like:
And.apply(Char.apply("a"), Char.apply("b");
我不知道你到底想做什么,但考虑到你目前对 Char
的实施,我认为这不会奏效。似乎您想编写一个 lambda 来删除 a
和另一个删除 b
,但是 Char.apply("a")
不会创建另一个函数,但实际上会从您的 ausdruck
字符串!相反,您的 Char
lambda 可能还应该 return 另一个 lambda,并且该 lambda 不应该修改某些 static
变量,而是 return 另一个 String 参数。
Function<String, Function<String, String>> stripChar =
c -> (s -> s.startsWith(c) ? s.substring(1) : "ERROR");
Function<String, String> stripAandC = compose.apply(stripChar.apply("c"), stripChar.apply("a"));
System.out.println(stripAandC.apply("cash"));
输出为 sh
。
最后,如果你想将它与 String
以外的任何东西一起使用,那么让 compose
成为一个实际的方法而不是 lambda 可能是有意义的,这样你就可以利用仿制药。此外,您可以使用 andThen
:
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))
and
不是必需的,参见 Function.andThen
方法
f = consume("a").andThen( consume("b) )
很遗憾,没有"curry";否则,我们可以这样做
f = consume2.curry("a") .andThen ( consume2.curry("b") );
static BiFunc<Str,Str,Str> consume2 = (input,x)-> {...return input.substring(x.length()); ..
如果你设计自己的功能接口,使用像 curry 这样需要的方法,那就更好了。
interface F1
String apply(String);
F1 and(F1);
interface F2
String apply(String,String);
F1 curry(String);