【问题标题】:Sum objects based on field value using Streams API使用 Streams API 根据字段值对对象求和
【发布时间】:2014-11-24 13:17:20
【问题描述】:

我想知道是否可以使用新的 Streams API 在一行中执行以下操作:

List<MyItem> arr = new ArrayList<>();

// MyItem has a single field, which is a value
arr.add(new MyItem(3));
arr.add(new MyItem(5));

// the following operation is the one I want to do without iterating over the array
int sum = 0;
for(MyItem item : arr){
  sum += item.getValue();
}

如果数组只包含ints,我可以这样做:

int sum = array.stream().mapToInt(Integer::intValue).sum();

但是,我可以将相同的想法应用于任意对象列表吗?

【问题讨论】:

    标签: java collections java-8


    【解决方案1】:

    你仍然可以做到。只需更改映射方法:

    int sum = arr.stream().mapToInt(MyItem::getValue).sum();
    

    您甚至可以将整个代码 sn-p 缩减为一行:

    int sum = Stream.<MyItem>Of(new MyItem(3),new MyItem(5)).mapToInt(MyItem::getValue).sum();
    

    甚至更短(感谢@MarkoTopolnik 的评论):

    int sum = Stream.Of(new MyItem(3),new MyItem(5)).mapToInt(MyItem::getValue).sum();
    

    【讨论】:

    • 顺便说一句,还有一个问题。如果我想要的值包含在另一个对象中,在 MyItem 中,如下所示:int value = myItem.getSubitem().VALUE。然后呢?
    • @habitats 我不确定您是否可以链接方法引用,但您始终可以使用 lambda 表达式 - mapToInt(m -&gt; m.getSubitem().VALUE)
    • 如果你让流来做,你可以链接方法引用:map(MyItem::getSubItem).mapToInt(SubItem::getValue).
    • @Holger 这是个好主意。我没有想到。我假设mapToInt(MyItem::SubItem::getValue) 行不通,不是吗?这就是我想到的链接。
    • 不,尽管您可以将其写成 lambda 而不是方法引用。
    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 2013-08-14
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多