[英]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.apply(Char.apply("a"), Char.apply("b"));
我想這就是你想要的
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) )
不幸的是,沒有“咖喱”; 否則,我們可以這樣做
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);
如果我正確理解了這個問題,你想要創建一個函數來編譯一個新函數,用另一個函數的結果執行一個函數。 在lambda中執行此操作的最佳方法是返回一個新的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
。
關於你的具體例子
和方法的調用必須看起來像:
And.apply(Char.apply("a"), Char.apply("b");
我不確切地知道你想要做什么,但鑒於你目前對Char
實現,我認為這不會起作用。 看起來你想組成一個lambda來刪除a
用另一個刪除b
,但Char.apply("a")
不會創建另一個函數,但實際上從你的ausdruck
字符串中刪除了"a"
! 相反,你的Char
lambda應該也可以返回另一個lambda,而lambda不應該修改一些static
變量,而是接受並返回另一個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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.