【问题标题】:Use java streams to update objects based on a particular check使用 java 流根据特定检查更新对象
【发布时间】:2019-08-29 15:05:05
【问题描述】:

我有一个 testAListTestA 的对象列表。我正在试验 Java 流,我想要实现的是更新该列表中满足检查的所有对象的 String b 属性。

class TestA {
    private String a;
    private String b;
}

到目前为止,以下是我使用流实现的目标:

if(testAList!=null) {
 testAList.forEach(testA -> {
    if(testA.getA().equals("STREAMS") {
       testA.setB("JUST_TEST");
    }
 });
}

我很确定可以使用某些谓词以更好的方式重写此检查,但无法找到正确的匹配项。我看到了filter,但我认为它不能被使用,因为我想要完整的源代码testAList(但对象内部有一些更新)。

任何提示都足够了:)

【问题讨论】:

  • replaceAll(x -> if(x.getA().equals("STREAMS") { x.setB("JUST_TEST"); return x; }; return x;)未编译,但看replaceAll
  • 这里只使用for循环。
  • 基本上是list.stream().filter(...).forEach(...)(过滤器不会从列表中删除元素,只是从流中删除)如果你有相应的方法:list.stream().filter(TestA::isAStreams).forEach(this::setBJustTest)(显然有更好的名字)
  • @CarlosHeuberger 我在您的评论出现之前就开始输入我的答案。很生气,现在看起来像是我偷了你的主意!
  • filter() 实际上过滤流而不是实际的数组/列表。 @CarlosHeuberger 感谢这一行。清理了很多与流相关的东西。我以前没有想到它的坏处:) 一直把它与实际列表混淆。

标签: java foreach java-stream


【解决方案1】:

如果你真的需要,你可以这样做:

testAList.stream()
         .filter(testA -> "STREAMS".equals(testA.getA()))
         .forEach(a -> a.setB("JUST_TEST"))
         ;

作为练习,您还可以创建一个“isStreams”方法:

boolean isStreams(TestA a) {
    return "STREAMS".equals(a.getA());
}

//later
if(testAList!=null) {
    testAList.stream().filter(this::isStreams).forEach(a -> a.setB("JUST_TEST"));
}

更进一步:

void setBToJustTest(TestA a) {
    a.setB("JUST_TEST");
}

//later
testAList.stream().filter(this::isStreams).forEach(this::setBToJustTest);

这将“整齐”地消除流表达式中的所有细节。

除了在“this”上,您还可以在帮助器上静态声明它们并通过方法引用进行访问,例如:TestAHelper::isStreams

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多