簡體   English   中英

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.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM