Currying(柯里化)

目的:把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

示例:以达成建造者模式效果为例,用2种柯里化方式完成

//枚举
public enum Genre{
    FANTASY,
    HORROR,
    SCIFI;
}



@AllArgsConstructor
public class Book{
    private final Genre genre;
    private final String author;
    private final String title;
    private final LocalDate publicationDate;


    static Function<Genre,Function<String,Function<String,Function<LocalDate,Book>>>> book_creator
            = bookGenre->
            bookAuthor->
                    bookTitle->
                            bookPublicationDate
                                    ->new Book(bookGenre, bookAuthor, bookTitle, bookPublicationDate);

    public static AddGenre builder() {
        return genre
                ->author
                ->title
                ->publicationDate
                ->new Book(genre, author, title, publicationDate);
    }




    public interface AddGenre{
        Book.AddAuthor withGenre(Genre genre);
    }

    public interface AddAuthor{
        Book.AddTitle withAuthor(String author);
    }

    public interface AddTitle{
        Book.AddPublicationDate withTitle(String title);

    }

    public interface AddPublicationDate{
        Book withBook(LocalDate publicationDate);
    }
    
}

测试:

  Book book = Book.builder().
                withGenre(Genre.FANTASY).
                withAuthor("小王").
                withTitle("hello").
                withBook(LocalDate.of(1977, 1, 28));
        System.out.println(book);

        Book bk = Book.book_creator
                .apply(Genre.HORROR)
                .apply("大王")
                .apply("Into the Night")
                .apply(LocalDate.now());


        System.out.println(bk);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值