Java 8带有方法调用的过滤器

7

我正在学习Java 8的lambda和streams,并尝试一些示例。但是遇到了问题。这是我的代码:

fillUpdate(Person p){
    List<Address> notes = getAddress();
    notes.stream().filter( addr -> addr !=null).map( this::preparePersonInfo,p,addr);
}
private void preparePersonInfo(Person p, Address addr){
    // do some stuff
}

我在 .map 的 addr 字段(第二个参数)遇到编译错误。请问这个错在哪里,并且是否能够提供有关学习 Java 8 流的链接?顺便提一下,我正在按照这个链接 Java 8 lambda 进行操作。
2个回答

6
首先,map方法调用未声明addr变量,这是第一个问题。
其次,在map中使用无返回类型的方法,这是第二个问题。
你不能像尝试的那样使用方法引用(map(this::preparePersonInfo,p,addr)),因为方法引用的参数是隐式传递的。如果preparePersonInfo只需要一个Address参数,你可以这样写:
notes.stream().filter( addr -> addr !=null).forEach(this::preparePersonInfo);

因为在此情况下,Address参数将从Stream中传递。

您可能想要向Stream管道添加一些终端操作,否则它不会被处理。由于您的preparePersonInfo没有返回任何内容,所以它不能在map中使用(因为map将流元素映射到其他内容,所以它必须返回某些内容)。如果您只想对通过过滤器的每个流元素执行操作,则forEach可能适合您的需求。

因此,以下内容应该可以与您当前的preparePersonInfo方法一起使用:

notes.stream().filter( addr -> addr !=null).forEach (addr -> preparePersonInfo(p,addr));

10
如果原帖作者真的想使用方法引用,filter( addr -> addr !=null) 可以替换为 filter(Objects::nonNull)。请注意,这样不会改变原意,只是使语言更易理解。 - Holger

-1

虽然不是完全按照要求,但可以使用Lambda中的方法调用过滤——带参数的方法调用:

Stream<MyObject> MyObjectStream = MyObjectList.stream().filter(myobj -> StringUtils.isNotEmpty(myobj.getAccountNumber().trim()));
        MyObjectStream.forEach( o ->
                myService.getAccounts(o.getAccountNumber(), "Test"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接