目的:把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
示例:以达成建造者模式效果为例,用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);