当前位置: 首页 > 知识库问答 >
问题:

Java流修改元素,但获取原始列表中的所有元素

袁谭三
2023-03-14

我有一个java流,其中我必须只对一些对象应用操作,但我希望得到具有相同元素数的流。例如

我有用户类。

class User {
  String name;
  String balance;
  String company;
} 

我想增加50个现有余额为500或以上的用户的余额。在返回列表中,我还需要未修改余额的用户,

[   {
        "name": "john"
        "balance":  450
        "company": "AAA"
    }, 
    {
        "name": "Susana"
        "balance":  "550"
        "company": "BBB"
    },
    {
        "name": "Peter"
        "balance":  "300"
        "company": "CCC"
    }
]

回报应该是

[   {
        "name": "john"
        "balance":  450
        "company": "AAA"
    }, 
    {
        "name": "Susana"
        "balance":  "600"
        "company": "BBB"
    },
    {
        "name": "Peter"
        "balance":  "300"
        "company": "CCC"
    }
]

和原来的顺序一样,但是记录被修改了,这符合条件。任何想法我怎么能用流和功能方式做到这一点,没有如果,等等

我尝试了过滤器方法,但它只是将过滤后的值传递到下游。

共有1个答案

云正信
2023-03-14
users
.stream()
.filter( user -> user.getBalance() >= 500 ) 
.forEach( user -> { user.setBalance( user.getBalance() + 50 ) } ) ; 

forEach是一个终端操作,完成流的工作。

无需返回新列表。名为usersUser对象的原始列表仍然保留。原始列表中包含的一些对象将被forEach修改。

你不需要小溪。一个简单的for循环就可以了。

for( User user : users )
{
    int b = user.getBalance() ;
    if ( b >= 500 ) { user.setBalance( b + 50 ) ; }
}

如果你有一个流,使用stream#forEach可以获得与for循环相同的效果。

users
.stream()
.forEach( user -> {
    if ( user.getBalance() >= 500 ) 
    {
        user.setBalance( user.getBalance() + 50 ) ;
    }
}) ; 

在这种情况下,我想说for循环更容易阅读。流并不总是有利的。

你说:

不,如果不是的话

在某个时刻,你必须做一个比较,看看当前余额是否超过500。因此,if-else是进行这种比较的明显方式。在比较一个数字时,流并没有提供任何魔力。

users
.stream()
.filter( user -> user.getBalance() >= 500 ) 
.forEach( user -> { user.setBalance( user.getBalance() + 50 ) } ) ; 

正如ernest_k所评论的,您可以调用所有元素的setter,同时使用三元运算符将余额与500进行比较。如果低于500,则加零。如果达到我们的门槛,再加50。

users
.stream()
.forEach( user -> 
    user.setBalance( 
        user.getBalance() + 
        ( user.getBalance() >= 500 ? 50 : 0 ) 
    ) 
) ;

如果这种更紧凑的方法触发了副作用,例如对数据库的无意义写入,那么它就不合适了。

 类似资料:
  • 问题内容: 我有一个对象列表,其中每个对象返回。我如何使用Java 8流仅获得一个? 类具有以下方法; 我有 我正在尝试的是 但是上面的行没有返回 ,而是 我不想要的。 问题答案: 您应该用来从包含在主列表中每个对象中的列表中创建一个列表。请检查; 该调用适用于列表中包含with 的情况,因为这将导致下一行,因此我们应该将其过滤掉。还有其他方法可以实现这一点; -- -- 您可以按如下方式包含来自

  • 我想用Java 8编写纯函数,它将集合作为参数,对集合每个对象应用一些更改,并在更新后返回一个新集合。我希望遵循FP原则,所以我不希望更新/修改作为参数传递的集合。 有没有什么方法可以通过Stream API做到这一点,而不首先创建原始集合的副本(然后使用forEach或'normal'for循环)? 下面的示例对象,并假设我要将文本追加到object属性之一: 所以我想做一些类似下面的事情,但不

  • 主要内容:修改单个元素,修改一组元素Python 提供了两种修改列表(list)元素的方法,你可以每次修改单个元素,也可以每次修改一组元素(多个)。 修改单个元素 修改单个元素非常简单,直接对元素赋值即可。请看下面的例子: 运行结果: [40, 36, -26, 2, -66.2, 100, 7] 使用索引得到列表元素后,通过 赋值就改变了元素的值。 修改一组元素 Python 支持通过切片语法给一组元素赋值。在进行这种操作时,如果

  • 问题内容: 在带有Python的Selenium中,是否可以将WebElement的所有子级作为列表获取? 问题答案: 是的,您可以通过或实现。 但是,这听起来并不像查找某个元素的 所有子 元素的有效用例。要获得所有直接/间接孩子都是昂贵的手术。请进一步说明您要做什么。应该有更好的方法。

  • 在Selenium和Python中,是否可以将WebElement的所有子元素作为列表?

  • 问题内容: 如果我有两个清单 什么是获取熊猫数据框的最优雅的方式,如下所示: 注意,第一列是索引。 问题答案: 使用于: