2016-11-30 55 views
1

我有兩個java名單如下:連接兩個Java流

"type 1" list: 
[(id:1, type: 1, value: 100), (id:2, type: 1, value: 50), ...] 
"type 2" list: 
[(id:1, type: 2, value: 150), (id:2, type: 2, value: 70), ...] 

而且我希望這樣的事情:

Stream.concat(list1.stream(), list2.stream()) 
.collect(groupingBy(x -> x.getItem)).values().stream() 
.map (listOftwo -> ....) 

Stream.concat(list1.stream(), list2.stream()) 
.parallel() 
// I need to combine somehow items with the same id for following process 
// ideally to have Tuple2(l1item, l2item) after that 
.groupBy(x -> x.getId()) 
.map ((l1item, l2item) -> { 
    // some processing 
}).collect(Collectors.toList()) 

AFAIK它可以通過實施但我不想要那張中間地圖。有任何想法嗎 ?我可以使用任何庫。

感謝

回答

1

AbacusUtil提供的API做的正是你想要什麼:

Stream.concat(a, b).parallel().groupBy(x -> x.getId()).map(..); 

宣言:我是AbacusUtil的開發商。

+0

看起來很有趣,謝謝 – Normal

2

如果我理解正確的,你...有一個重載的groupingBy減少已分組元素,像這樣:

Map<Boolean, Double> result = Arrays.asList("a", "b", "ag").stream() 
      .collect(Collectors.groupingBy(elem -> elem.startsWith("a"), 
        Collectors.averagingInt(String::length))); 

    System.out.println(result); // {false=1.0, true=1.5} 

這組元素,然後再應用其他收藏家對價值,減少它們。

+0

你理解的對,它可以被認爲是一個解決方案。我只想知道是否還有一些其他選項(不一定來自標準api),它允許在Reducer一側使用Tuple2(firstListItem,secondListItem)工作。 – Normal

+1

@Normal我認爲你想說的是,在減少方面你想消費/減少這些列表*不同*的方式,對嗎?如果是這樣,那麼,不,真的不知道這是否可能。你可以做的是首先groupBy然後做任何你想要的結果。 – Eugene

+0

你是對的,目前的做法導致我寫這樣的減速器代碼: list - > { if(list.get(0).type == 1){ .... } else .... }我試圖避免這種情況 – Normal