2017-03-06 54 views
1

我是新来的Java 8个流API和我寻求一个解决方案,通过我的对象列表运行和aggretate某些属性能够最终得到的新列表该属性类型和所有聚合结果。Java的8个流 - 骨料和回报聚集步骤

例如我的列表中有10人对象中,我想基于第一人年龄

的所有年龄的差异列表是,即使是在Java中可能有流?

例如:

person1.age = 10 
person2.age = 12 
person3.age = 20 
person4.age = 25 
person5.age = 30 

做流魔法类型为int的结果应该和后看起来像这样

0 
2 //based on first age 12 - 10 
10 // based on first age 20 - 10 
15 // ... 
20 
+2

*的是,即使在java中可以不写tooo多的代码?*我甚至不觉得什么样的代码你尝试过这么远。 – nullpointer

+0

我的意思是,没有编写流和那些东西的自定义colletor是可能的。 – Joey

+1

让我们看看,你已经尝试过,然后让我们弄清楚可以做些什么来改进。 – nullpointer

回答

2

我假设你有一个名为PersongetAge()吸气剂就可以了类。然后,你可以这样做:

list.stream() 
    .skip(1) 
    .map(Person::getAge) 
    .map(age -> age - list.get(0).getAge()) 
    .map(Math::abs) 
    .forEach(System.out::println); 

.skip(1) - 从列表中跳过的第一人,因此结果将不包含0通过第一人的年龄比较自己生产的。 - 作为“差异”的绝对值永远是正值(无论我有10年,而你有20年,或者我有20年,你有10年,差异是10年)。

您可能要添加.distinct()删除重复。

最后,你可能需要使用不同的终端操作 - 例如.collect(toList()),而不是打印。

1

假设列表已经排序(如果不是你需要按年龄分类)。您可以提取lst.get(0).getAge()然后做这样的事情:

List<Integer> diff = lst.stream().map((x)->x.getAge()-firstAge).collect(Collectors.toList()); 

我不会纵容任何命名Listlst。这是不好的做法,但看到你没有与我们分享任何代码,我不知道你给你的名单命名。

+0

*我的意思是,如果没有为流编写自定义的colletor,并且来自OP – nullpointer

+0

@nullpointer的意见,那么可能没有看到这一点。我将删除答案 – CraigR8806

+0

@nullpointer实际上,我认为这不会被认为是'自定义收集器',因为它利用'Collectors.toList()'从'Stream'生成返回的'List'。 – CraigR8806

0

我认为你有一个Person类,和我做了这个假设我的代码,因为你给什么。

public static void main(String [] args) { 
    List<Person> list = new ArrayList<Person>(); 
    Person person1 = new Person(); 
    person1.age = 10; 
    Person person2 = new Person(); 
    person2.age = 12; 
    Person person3 = new Person(); 
    person3.age = 20; 
    Person person4 = new Person(); 
    person4.age = 25; 
    Person person5 = new Person(); 
    person5.age = 30; 

    list.add(0,person1); 
    list.add(person2); 
    list.add(person3); 
    list.add(person4); 
    list.add(person5); 

    list.stream().forEach(person -> System.out.println(person.age-list.get(0).age)); 
} 

在这里,你有

如果你想要把值的列表:

List<Integer> list2 = new ArrayList<Integer>(); 
list.stream().forEach(person -> list2.add(person.age-list.get(0).age)); 

因为你写person.age=10看来你设置的age能见度为public,这是不是很好,你需要将它设置为private并为其提供一个吸气剂:

public int getAge(){ 
    return this.age; 
} 
+1

'list.add(0,person1);' - 这个'0'是多余的。你的流应该有'.skip(1)',否则它总会打印0作为第一个结果,因为它比较了第一个人和自己。最后,在单个lamba中进行如此多的操作是一个糟糕的做法 - 您应该使用多个'.map(...)'来代替。 –

+1

关于你的编辑,你不应该有一个有状态的消费者功能,它增加了一些列表。这就是'.collect(...)'的用途。 –