我想通过列表中的第一个元素进行过滤,然后通过第二个元素进行分组。
public class MyClass{
int index;
String fruit;
int quantity;
public MyClass(int index, String fruit, int quantity){
this.index = index;
this.fruit = fruit;
this.quantity = quantity;
}
public int getIndex(){
return index;
}
public String getFruit(){
return fruit;
}
public int getQuantity(){
return quantity;
}
ArrayList<MyClass> test = new ArrayList<MyClass>();
MyClass t1 = new MyClass(1, "apple", 6);
test.add(t1);
MyClass t2 = new MyClass(2, "apple", 6);
test.add(t2);
MyClass t3 = new MyClass(1, "banana", 6);
test.add(t3);
MyClass t4 = new MyClass(2, "banana", 6);
test.add(t4);
...
Myclass t20 = new MyClass(10, "apple", 6);
if (MyClass.getIndex() <= 5){
Map<String, Integer> map = test.stream()
.collect(groupingBy(MyClass::fruit, averagingLong(MyClass::quantity)));
}
//desired return
// {apple: 12, banana:12}
}
在使用Java Stream获得平均值之前,我过滤了第一个元素,即index。这样做合适吗?
你说平均,但你的问题显示了以下内容:
//期望的回报
//{苹果:12,香蕉:12}
要提供所需的返回,您需要执行summingInt
,而不是averagingInt
Map<String, Integer> map = test.stream().filter(t->t.getIndex()<=5)
.collect(Collectors.groupingBy(MyClass::getFruit,
Collectors.summingInt(MyClass::getQuantity)));
System.out.println(map);
{banana=12, apple=12}
问题内容: 给出以下列表: 我想将[a]的每个元素重复其在[b]中的对应位置的编号,以产生此结果: 即0发生1次,5发生2次,1发生1次。 问题答案: 内容如下: -重复elem次 从两个列表中组成一个2元组的列表,将每个元素与另一个列表中的对应元素配对。这为您提供了用例中需要传递给的确切信息。 -将迭代器的结果列表展平为单个值列表。您既可以像我一样,也可以像马丁·彼得斯那样。
我正在尝试根据第二个列表中的值筛选对象列表。 现在我想移除列表A的项目,该项目的ID在列表B中可用。 null null 感谢任何帮助
问题内容: 鉴于: 我想删除第一个项目中的那个项目。因此,在这种情况下,我们将删除以: 我当前的代码是: 这可行,但是很慢。什么是更好的方法呢? 编辑:我之前没有测试过性能,所以我可能做错了,但是我得到了: 问题答案: 反向删除,就地修改: 就地修改意味着这样做效率更高,因为它不会创建新列表(如列表理解那样)。 由于OP要求提供高效的解决方案,因此这里比较了两个投票最高的答案。 设定 - 清单理解
问题内容: 我有两个看起来像的清单: 我要做的是将list1的所有那些元素都保留在list2中。结果应该是: 问题答案: 使用运算符,您可以检查元素是否在序列中。 使用列表理解: 但是效率不高。您最好转换为对象。
我看到过其他几个类似于这个问题的问题,但我还没有找到任何解决我的问题的方法。
我有一个java POJO收集metics如下: 我有一个来自上面pojo的度量列表,如