如何创建收集最大值的地图

时间:2017-03-06 07:22:52

标签: java list java-8 java-stream

我有一个对象列表。每个对象都有两个属性。

  • 名称
  • idSet

示例:

 1. name = "CH2OH"       idSet = "223"
 2. name = "CH2CH2OH"    idSet = "255,310"
 3. name = "CH2OH"       idSet = "223,256"
 4. name = "CH2OH"       idSet = "223,256,295"

1,3和4具有相同的名称但不同的idList。但是3包含1的idList项+一个新的id,而4包含3的idList +一个新的id。

我想获取一个列表或流,名称为键,idList为值。但是,idList应始终获得最大值

根据示例预期输出

 - name = "CH2CH2OH"     idSet = "255,310"
 - name = "CH2OH"        idSet = "223,256,295"

如何使用java 8获取它。我尝试过this。但问题是通过只考虑一个属性来获得不同的流。它随机得到一个并消除其他人。我想通过考虑两个属性来获取流。谢谢

1 个答案:

答案 0 :(得分:1)

尝试这样的事情。我在昨天观看的YT视频中找到了这个解决方案。转到大约1:58:30

https://www.youtube.com/watch?v=1OpAgZvYXLQ

List<MyObjects> myList = createObjects();


Map<String, Optional<String>> myMappedList = myList.stream()
             .collect(Collectors.groupingBy(MyObjects::getName, 
                     Collectors.mapping(MyObjects::getidSet, 
                         Collectors.maxBy((a, b) -> a.toString().length() - b.toString().length()))));

//Here's the output with your example (Using toString override in MyObjects Class):

System.out.println(myMappedList);

{CH2OH=Optional[223,256,295], CH2CH2OH=Optional[255,310]}

通过“max”,比较器正在寻找具有最长字符串长度的idset。

希望这会有所帮助,我认为这是一个很好的问题。 Venkat Subramaniam认为重要的是谈论......