2017-03-06 28 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(...)'的用途。 –