如何按属性对对象列表进行分组,然后使用(键,值)对迭代结果?

3

我希望能够根据一个属性对对象列表进行分组,并使用(Key, Value)对迭代结果。

我已经找到了在Java 8中使用属性来对对象列表进行分组的方法,如下所示:

// filteredPageLog has the filtered results from PageLog entity.

Map<String, List<PageLog>> results = 
filteredPageLog.stream().collect(Collectors.groupingBy(p -> p.getSessionId()));

但是结果只有条目集(entrySet 属性中带有值)。keySet 和 valueSet 将具有 null 值。我想要像这样迭代:
results.forEach((key,value) -> {
//logic
});

results.forEach((key, value) -> { //逻辑 }); - Vishwa Ratna
3个回答

3

使用

results.entrySet().forEach(entry -> {
     var key = entry.getKey();
     var value = entry.getValue();
//logic
});

在这一行代码"results.entrySet().forEach(entry -> {"上遇到了空指针异常。 - Mohammed Shirhaan
@MohammedShirhaan 这意味着“results”为空。 - talex
当我调试时,entrySet有值。@talex - Mohammed Shirhaan
那么,null是什么? - talex
for (Map.Entry<String, List<PageLog>> entry : results.entrySet()) { String sessionId = entry.getKey(); List<PageLog> pageLogs = entry.getValue(); //逻辑处理 } // 这个可行 - Mohammed Shirhaan

2
最初的回答:
虚拟地图示例:

虚拟地图示例:

Map<String,String> map = new HashMap() {{
             put("1","20");
             put("2","30");
           }};

你可以用两种方法实现:
1. Map<K, V>.forEach() 方法需要一个 BiConsumer<? super K,? super V> 作为参数,并且 BiConsumer<T, U> 抽象方法的签名是 accept(T t, U u)
map.forEach((keys,values) -> { String k = keys ;
                               String v= values;
                                //logic goes here
                              });

2. Map<K, V>.entrySet().forEach() 需要一个 Consumer<? super T> 作为参数,而 Consumer<T> 抽象方法的签名是 accept(T t)

注:该方法用于遍历 Map 中每个键值对,并执行传入的 Consumer 函数。


map.entrySet().forEach((entry) -> { String k = entry.getKey();
                                    String v= entry.getValue();
                                    //logic goes here
                                   });       

0

Java 中没有元组。在这里 你可以找到更详细的解释。你可以迭代键、值或条目,但不能迭代元组。


没有元组是什么意思? - Vishwa Ratna
在Java中没有像Scala那样的语法糖,例如参见https://www.alexecollins.com/java-tuples。你不能写成(key, value)而不是entry。只能作为lambda传递给接收适当函数接口的重载方法。 - ilinykhma
你确定不能写成entry(key, value)而非can't write (key, value)吗? - Vishwa Ratna
我忘记了map.forEach(BiConsumer<? super K,? super V>),你的答案很完美。所以,在这种情况下,lambda看起来像两个元素的元组)。 - ilinykhma
没错!别担心,我只是在核对你的概念。 :) - Vishwa Ratna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接