java 8 集合分组_Java 8:按集合分组
java 8 集合分組
在繼續閱讀Venkat Subramaniam的“ Java函數式編程 ”時,我到達了介紹Stream#collect函數的那部分。
我們想收集一個人,按年齡分組并返回一張方便的地圖(年齡->人的名字)。
要刷新,這是Person類的樣子:
我們可以用Java 8編寫以下代碼來獲取按年齡分組的人的名字的地圖:
Stream<Person> people = Stream.of(new Person("Paul", 24), new Person("Mark", 30), new Person("Will", 28)); Map<Integer, List<String>> peopleByAge = people.collect(groupingBy(p -> p.age, mapping((Person p) -> p.name, toList()))); System.out.println(peopleByAge);{24=[Paul], 28=[Will], 30=[Mark]}我們正在集合上運行“收集”功能,并在進行時按“年齡”屬性進行分組,并對人員姓名而不是人員本身進行分組。
這與您在Ruby中所做的稍有不同,在Ruby中您可以調用一個“ group_by”函數:
> people = [ {:name => "Paul", :age => 24}, {:name => "Mark", :age => 30}, {:name => "Will", :age => 28}] > people.group_by { |p| p[:age] } => {24=>[{:name=>"Paul", :age=>24}], 30=>[{:name=>"Mark", :age=>30}], 28=>[{:name=>"Will", :age=>28}]}這會向我們提供按年齡分組的人員列表,但我們需要應用其他“地圖”操作來將其更改為姓名列表:
> people.group_by { |p| p[:age] }.map { |k,v| [k, v.map { |person| person[:name] } ] } => [[24, ["Paul"]], [30, ["Mark"]], [28, ["Will"]]]在這個階段,我們有一個(年齡,名字)對的數組,但是幸運的是Ruby 2.1.0有一個函數“ to_h”,我們可以調用它來再次返回哈希:
> people.group_by { |p| p[:age] }.map { |k,v| [k, v.map { |person| person[:name] } ] }.to_h => {24=>["Paul"], 30=>["Mark"], 28=>["Will"]}如果要在對集合執行歸約操作時遵循Java按屬性分組的方法,則將具有以下內容:
> people.reduce({}) { |acc, item| acc[item[:age]] ||=[]; acc[item[:age]] << item[:name]; acc } => {24=>["Paul"], 30=>["Mark"], 28=>["Will"]}如果我們使用Clojure,則可能會得到如下所示的結果:
(def people[{:name "Paul", :age 24} {:name "Mark", :age 30} {:name "Will", :age 28}])> (reduce (fn [acc [k v]] (assoc-in acc [k] (map :name v))) {} (group-by :age people)) {28 ("Will"), 30 ("Mark"), 24 ("Paul")}我以為Java版本從一開始看起來有點怪異,但是用其他幾種語言解決了這個問題,實際上還不錯。
最好知道是否有更好的方法來使用Ruby / Clojure!
翻譯自: https://www.javacodegeeks.com/2014/02/java-8-group-by-with-collections.html
java 8 集合分組
總結
以上是生活随笔為你收集整理的java 8 集合分组_Java 8:按集合分组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器被ddos会断网吗(ddos总是断
- 下一篇: linux文件退出编辑命令(linux文