青岛网站网站建设,外贸网站推广的方法,北京怎样建网站,淘宝做任务网站q7goodies事例在Data Geekery #xff0c;我们喜欢Java。 而且#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL #xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 #xff0c;现在我们觉得是时候开始一个… q7goodies事例 在Data Geekery 我们喜欢Java。 而且由于我们真的很喜欢jOOQ的流畅的API和查询DSL 我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 现在我们觉得是时候开始一个新的博客系列了…… Java 8星期五 每个星期五我们都会向您展示一些不错的教程风格的Java 8新功能这些功能利用了lambda表达式扩展方法和其他出色的功能。 您可以在GitHub上找到源代码 。 Java 8 GoodieLambda和排序 排序数组和集合是Java 8 lambda表达式的绝佳用例原因很简单因为Comparator自从JDK 1.2引入以来一直都是FunctionalInterface 。 现在我们可以将lambda表达式形式的Comparators提供给各种sort()方法。 对于以下示例我们将使用此简单的Person类 static class Person {final String firstName;final String lastName;Person(String firstName, String lastName) {this.firstName firstName;this.lastName lastName;}Overridepublic String toString() {return Person{ firstName firstName \ , lastName lastName \ };}
} 显然我们也可以通过使它实现Comparable来向Person添加自然排序但是让我们关注外部Comparators 。 考虑以下Person列表其名称是使用一些在线随机名称生成器生成的 ListPerson people
Arrays.asList(new Person(Jane, Henderson),new Person(Michael, White),new Person(Henry, Brighton),new Person(Hannah, Plowman),new Person(William, Henderson)
); 我们可能想按姓氏然后按名字对它们进行排序。 用Java 7排序 这样的Comparator器的一个“经典” Java 7示例是这样的 people.sort(new ComparatorPerson() {Overridepublic int compare(Person o1, Person o2) {int result o1.lastName.compareTo(o2.lastName);if (result 0)result o1.firstName.compareTo(o2.firstName);return result;}
});
people.forEach(System.out::println); 以上将产生 Person{firstNameHenry, lastNameBrighton}
Person{firstNameJane, lastNameHenderson}
Person{firstNameWilliam, lastNameHenderson}
Person{firstNameHannah, lastNamePlowman}
Person{firstNameMichael, lastNameWhite}用Java 8排序 现在让我们将以上内容翻译为等效的Java 8代码 ComparatorPerson c (p, o) -p.lastName.compareTo(o.lastName);c c.thenComparing((p, o) -p.firstName.compareTo(o.firstName));people.sort(c);
people.forEach(System.out::println); 结果显然是相同的。 如何阅读以上内容 首先我们为本地Person Comparator变量分配一个lambda表达式 ComparatorPerson c (p, o) -p.lastName.compareTo(o.lastName); 与ScalaC或Ceylon不同它们通过val关键字或类似关键字 知道从表达式到局部变量声明的类型推断而Java从变量或参数成员声明向要分配的表达式执行类型推断。 换句话说类型推断是从“左到右”而不是从“右到左”执行的。 这使得链接Comparators有点麻烦因为Java编译器无法将lambda表达式的类型推断延迟到将比较器传递给sort()方法之前。 但是一旦为变量分配了Comparator 就可以通过thenComparing()流畅地链接其他比较器 c c.thenComparing((p, o) -p.firstName.compareTo(o.firstName)); 最后我们将其传递给List的新sort()方法这是直接在List接口上实现的默认方法 default void sort(Comparator? super E c) {Collections.sort(this, c);
}上述限制的解决方法 虽然Java的类型推断“局限性”可能会让人感到沮丧但我们可以通过创建通用的IdentityComparator来解决类型推断 class Utils {static E ComparatorE compare() {return (e1, e2) - 0;}
} 使用上面的compare()方法我们可以编写以下流畅的比较器链 people.sort(Utils.Personcompare().thenComparing((p, o) - p.lastName.compareTo(o.lastName)).thenComparing((p, o) - p.firstName.compareTo(o.firstName))
);people.forEach(System.out::println);提取密钥 这可以变得更好。 由于我们通常从两个Comparator参数比较相同的POJO / DTO值因此我们可以通过“键提取器”功能将它们提供给新的API。 它是这样工作的 people.sort(Utils.Personcompare().thenComparing(p - p.lastName).thenComparing(p - p.firstName));
people.forEach(System.out::println); 因此在给定Person p我们为API提供了提取例如p.lastName 。 实际上一旦我们使用了键提取器我们就可以省略自己的实用程序方法因为这些库还有一个comparing()方法来初始化整个链 people.sort(Comparator.comparing((Person p) - p.lastName).thenComparing(p - p.firstName));
people.forEach(System.out::println); 同样我们需要帮助编译器因为它不能推断所有类型即使原则上在这种情况下sort()方法将提供足够的信息。 要了解有关Java 8的通用类型推断的更多信息请参见我们以前的博客文章 。 结论 与Java 5一样可以在JDK库中看到升级的最大改进。 当Java 5为Comparators带来类型安全性时Java 8使它们易于读取和编写给出或接受奇数类型推理怪癖。 Java 8将彻底改变我们编程的方式下周我们将看到Java 8如何影响我们与SQL交互的方式。 参考 Java 8 Friday GoodiesLambda和Sorting来自我们的JCG合作伙伴 Lukas Eder在JavaSQL和JOOQ博客中。 翻译自: https://www.javacodegeeks.com/2014/02/java-8-friday-goodies-lambdas-and-sorting.htmlq7goodies事例