package java8; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.function.Function; import java.util.function.BiFunction; import java.util.stream.Collectors; class Article { private String author; private String tag; private int rank; public Article(String _author, String _tag, int _rank) { this.author = _author; this.tag = _tag; this.rank = _rank; } @Override public String toString() { return String.format("Article author: " + this.author + " tag: " + this.tag + " rank: " + this.rank); } public String getAuthor() { return this.author; } public String getTag() { return this.tag; } public int getRank() { return this.rank; } } /* * Jerry 2016-01-21 12:24PM Function signature This is a functional interface * whose functional method is apply(Object). * * Parameters: <T> the type of the input to the function <R> the type of the * result of the function Since: 1.8 */ @SuppressWarnings("unused") public class FunctionCombine { private static List<Article> getTestData() { ArrayList<Article> data = new ArrayList<Article>(); data.add(new Article("Jerry", "ABAP", 1)); data.add(new Article("Jerry", "Scala", 3)); data.add(new Article("Jerry", "JavaScript", 2)); data.add(new Article("Orlando", "Swift", 4)); return data; } /* * Jerry 2016-01-21 12:58PM be careful about this syntax: ? is necessary * 如果用了::, 前面就不应该用lamda */ private static void printList(List<? extends Object> list) { list.forEach(a -> { System.out.println("list item: " + a); }); /* * cannot insert any new element except null The method add(capture#2-of * ? extends Object) in the type List<capture#2-of ? extends Object> is * not applicable for the arguments (String) list.add("1"); */ } private static void insertList(List<? super Number> list) { // can insert list.add(1.2f); list.add(1); } private static void superTest() { ArrayList<Number> a = new ArrayList<Number>(); insertList(a); printList(a); } public static void combineTest() { Function<Integer, Integer> times2 = e -> e * 2; Function<Integer, Integer> squared = e -> e * e; // 先执行参数,再执行调用者 /* * 1. 4 * 4 = 16 16 * 2 = 32 */ System.out.println("result: " + times2.compose(squared).apply(4)); // 32 /* * 先执行调用者: 4 * 2 = 8 再执行then传入的function 8 * 8 = 64 */ System.out.println("result: " + times2.andThen(squared).apply(4)); // 64 } /* * use this way to get a stream: Stream<Person> people = Stream.of(new * Person("Paul", 24), new Person("Mark", 30), new Person("Will", 28)); 由于 * BiFunction 接收两个参数,它只提供 andThen 函数。你不能将一个函数的结果放在一个接收两个参数的函数中,因此没有 compose * 函数。 */ public static void articleTest() { Object object = Collectors.toList(); // 输入参数为String和List<Article>,输出为根据name属性进行排序后的新List BiFunction<String, List<Article>, List<Article>> byAuthor = (name, articles) -> articles.stream() .filter(a -> a.getAuthor().equals(name)) .collect(Collectors.toList()); BiFunction<String, List<Article>, List<Article>> byTag = (tag, articles) -> articles .stream().filter(a -> a.getTag().equals(tag)) .collect(Collectors.toList()); List<Article> result = byAuthor.apply("Jerry", getTestData()); System.out.println("Jerry's book"); printList(result); // Jerry 2016-01-21 13:47PM - comparator需要返回一个int Function<List<Article>, List<Article>> sortByRank = articles -> articles.stream() .sorted((x, y) -> y.getRank() - x.getRank()) .collect(Collectors.toList()); List<Article> Rankresult = sortByRank.apply(getTestData()); System.out.println("rank sort result"); printList(Rankresult); Function<List<Article>, Optional<Article>> first = a -> a.stream().findFirst(); // 先sort,再返回头一个元素 Function<List<Article>, Optional<Article>> top = first.compose(sortByRank); Optional<Article> topArticle = top.apply(getTestData()); System.out.println("top article: " + topArticle); // find Jerry's top article: // 接受两个输入,author和list本身 BiFunction<String, List<Article>, Optional<Article>> topByAuthor = byAuthor.andThen(sortByRank).andThen(first); System.out.println("Jerry's top article: " + topByAuthor.apply("Jerry", getTestData()).get()); } public static void main(String[] args) { articleTest(); // superTest(); } }
输出:
Jerry's book list item: Article author: Jerry tag: ABAP rank: 1 list item: Article author: Jerry tag: Scala rank: 3 list item: Article author: Jerry tag: JavaScript rank: 2 rank sort result list item: Article author: Orlando tag: Swift rank: 4 list item: Article author: Jerry tag: Scala rank: 3 list item: Article author: Jerry tag: JavaScript rank: 2 list item: Article author: Jerry tag: ABAP rank: 1 top article: Optional[Article author: Orlando tag: Swift rank: 4] Jerry's top article: Article author: Jerry tag: Scala rank: 3