Поняв, что Java 8 должна быть выпущена GA в течение следующих нескольких недель, я подумал, что пришло время взглянуть на нее и за последнюю неделю читал книгу Венката Субраманиама .
Я до главы 3, которая охватывает сортировку людей. Класс Person определяется примерно так:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
static class Person { private String name; private int age; Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return String.format("Person{name='%s', age=%d}", name, age); }} |
В первом примере мы берем список людей, а затем сортируем их по возрастанию:
|
1
2
|
List<Person> people = Arrays.asList(new Person("Paul", 24), new Person("Mark", 30), new Person("Will", 28));people.stream().sorted((p1, p2) -> p1.age - p2.age).forEach(System.out::println); |
|
1
2
3
|
Person{name='Paul', age=24}Person{name='Will', age=28}Person{name='Mark', age=30} |
Если бы мы написали функцию, которая делала бы то же самое в Java 7, это выглядело бы так:
|
01
02
03
04
05
06
07
08
09
10
|
Collections.sort(people, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.age - o2.age; }});for (Person person : people) { System.out.println(person);} |
Java 8 сократила объем кода, который мы должны написать, хотя он все еще сложнее, чем то, что мы могли бы сделать в Ruby:
|
1
2
3
|
> people = [ {:name => "Paul", :age => 24}, {:name => "Mark", :age => 30}, {:name => "Will", :age => 28}]> people.sort_by { |p| p[:age] }=> [{:name=>"Paul", :age=>24}, {:name=>"Will", :age=>28}, {:name=>"Mark", :age=>30}] |
Через несколько страниц Venkat показывает, как вы можете приблизиться к этому с помощью функции сравнения Comparator # :
|
1
2
|
Function<Person, Integer> byAge = p -> p.age ;people.stream().sorted(comparing(byAge)).forEach(System.out::println); |
Я думал, что мог бы сделать это проще, вставив лямбду ‘byAge’ следующим образом:
|
1
|
people.stream().sorted(comparing(p -> p.age)).forEach(System.out::println); |
Кажется, что это компилируется и работает правильно, хотя IntelliJ 13.0 предполагает, что существует проблема « циклического вывода ». IntelliJ рад, если мы явно приведем лямбду следующим образом:
|
1
|
people.stream().sorted(comparing((Function<Person, Integer>) p -> p.age)).forEach(System.out::println); |
IntelliJ также выглядит счастливым, если мы явно введем «p» в лямбда-выражении, поэтому я думаю, что на этом я пока остановлюсь:
|
1
|
people.stream().sorted(comparing((Person p) -> p.age)).forEach(System.out::println); |