如何在 Stream 链中调用 setter

2022-09-03 12:48:39

如何在不使用 forEach() 的情况下调用 Stream 链中的 setter?

List<Foo> newFoos = foos.stream()
        .filter(foo -> Foo::isBlue)
        .map(foo -> foo.setTitle("Some value")) //I am unable to use this because also changing the data type into Object
        .collect(Collectors.toList());

答案 1

使用这样的偷看方法。它不会影响流。

    List<Foo> newFoos = foos.stream()
            .filter(Foo::isBlue)
            .peek(foo -> foo.setTitle("Some value"))
            .collect(Collectors.toList());

答案 2

别这样。

如果您使用功能模式,请不要在其中引入任何命令式/过程性内容。

的目的是将一个对象转换为另一个对象。通过设计,它意味着纯粹的功能性(无副作用)。不要违反其功能含义。map

请改用:forEach

List<Foo> newFoos = foos.stream()
                        .filter(foo -> Foo::isBlue)
                        .collect(toList());

newFoos.forEach(foo -> foo.setTitle("Some value"));

你在这里没有什么可失去的。甚至行数也保持不变(如果您担心这一点)。但是代码更具可读性和安全性。

如果需要两个管道而不是一个管道,请继续。不要试图使代码更短。在这种情况下,代码长度与安全性和可维护性无关。


推荐