2016-11-13 68 views
1

我有一个我想根据他们的年龄分组的人群列表(group1的年龄为< 20,group2的年龄> 20),并根据名称对每个组进行排序, 名单的人:使用Java 8 Streaming对一个集合进行分组和排序

组1:

Ane 12 
Col 14 

组2:使用Java 8岁

James 24 
thomas 34 
Xavier 55 

我想使用Java 8做这样的事情:

list.stream().collect(Collectors.groupingBy(... 
+1

你想按姓名先排序还是先按年龄分组? –

+0

@akaliza是关于将列表分成两组还是按多个年龄段进行分组的问题?如果是按照年龄段进行分组,则可以更新您的问题以确保清晰(并让我修复我的答案:)) – Shastick

回答

2

您将要使用partitioningBy收集器来代替。它将允许你指定一个谓词,并返回一个布尔键控地图:

Map<Boolean, List<?>> partitioned = list.stream().sorted(...).collect(Collectors.partitioningBy(...)); 
+0

如果我想要20至50岁之间的人,该怎么办?我可以链式分区吗? – akaliza

+1

不是。在这种情况下,您需要编写一个函数,为每个组返回不同的值,然后使用该函数执行“groupingBy”。 –

+0

我明白了,我们有一个谓词,因此我可以做这个p - > p.getAge()> = 20 && p.getAge()<50 – akaliza

4

你可以得到你想要的东西:

  • 按年龄排序你的整个人集合(然后名称)。
  • 对其进行分区。

注意,每个分区的顺序将保持不变:

import static java.util.Comparator.comparing; 
import static java.util.stream.Collectors.partitioningBy; 

people.stream() 
    .sorted(
    comparing(Person::getAge) 
     .thenComparing(Person::getName)) 
    .collect(partitioningBy(p -> p.getAge() >= 20)) 

感谢克里斯托弗,他改进建议:斯堪的纳维亚的Java必须为一组宜家汇编指令:)

一样光滑
+2

你应该使用'Comparator.comparing(Person :: getAge)'。 –

+1

谢谢,这是更清洁的方式:) – Shastick

+1

此外,为了使它更干净,'import static java.util.Collectors.partitioningBy'和'import static java.util.Comparator.comparing;' –

相关问题