如何在Stream链中调用setter

时间:2016-02-13 08:40:54

标签: java java-8 java-stream

如何在不使用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());

3 个答案:

答案 0 :(得分:11)

使用像这样的peek方法。它不会影响流。

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

答案 1 :(得分:2)

forEach似乎是一个更适合工作的工具,但是如果你不想使用它,你总是可以定义一个匿名的多行lambda:

List<Foo> foos = foos.stream()
        .filter(foo -> Foo::isBlue)
        .map(foo -> {
                        foo.setTitle("Some value");
                        return foo;
                    })
        .collect(Collectors.toList()); 

答案 2 :(得分:0)

请勿这样做。

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

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

改为使用forEach

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

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

在这里您不会失去任何东西。即使行数保持不变(如果您对此有所担心)。但是该代码更具可读性和安全性。

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